mysql命令
启动和停止mysql服务
net start mysql
net stop mysql
查看mysql版本信息
mysql --version
或者进入数据库后使用:
select version();
连接mysql服务器
mysql -u username -p -h 192.168.19.164 -P 3306 -D database_name
mysql8在-p后面不能输入密码,回车后再输入密码,-P后面是端口号,可以省略,默认3306;-D可以省略,直接写数据库名称
例如:
mysql -u test1 -p -P 3306 testdb1
退出连接客户端
\q
或 exit 或quit
显示帮助
\h
或help
清除当前输入
\c
如果输入了错误的命令或想要取消当前输入,可以使用此命令
执行外部 SQL 文件
\. filename.sql
或者source filename.sql
例如:
\. /path/to/script.sql
source /path/to/script.sql
显示所有数据库
SHOW DATABASES;
选择数据库
USE database_name;
切换数据库
\u database_name
显示当前数据库
\s
或者 status
显示数据库配置变量
show variables like 'secure_file_priv';
显示当前数据库中的所有表
SHOW TABLES;
显示表结构
DESCRIBE table_name;
或者
SHOW COLUMNS FROM table_name;
将查询结果保存到文本文件
into outfile子句可以将查询结果导出到文本文件,虽然并不一定要是CSV格式,但大多数情况下我们都会选择这种格式。
要将MySQL中的数据写入到操作系统的文件中, 首先需要具有FILE权限。而且为了安全需要配置参数secure_file_priv,这个参数是限制MySQL可以写入文件的目录,如果为空,表示不限制:
show variables like 'secure_file_priv';
我们在普通的select语句最后添加into outfile ‘/path/file_name’;即可将查询结果写入文件,这里的path就是参数secure_file_priv定义的目录(文件不能已存在):
select * from user_t where user_name like 'Li%' into outfile '/opt/mysql8.0.35/mysql-files/user.txt';
设置/查看变量
设置单个变量
SET @myVariable = 'some value';
设置会话级别变量
SET SESSION sort_buffer_size = 102400;
查看会话级别的变量值
SELECT @@SESSION.sort_buffer_size;
查看所有会话级别的变量值
SHOW SESSION VARIABLES;
设置全局变量
SET GLOBAL max_connections = 1000;
查看全局变量值
SELECT @@GLOBAL.max_connections;
查看指定的全局变量值
SHOW GLOBAL VARIABLES LIKE 'max_connections';
查看所有全局变量值
SHOW GLOBAL VARIABLES;
在启动MySQL时设置变量
可以在MySQL服务器的配置文件(如my.cnf或my.ini,取决于操作系统)中设置全局变量。例如:
[mysqld]
max_connections = 1000
修改配置文件后,需要重启MySQL服务来使更改生效。
查看数据库支持的字符集
show charset;
查看数据库支持的字符集校验规则
show collation;
查看数据库创建语句
show create database + 数据库名;
查看mysql连接情况
show processlist;
数据库
创建数据库
语法:CREATE DATABASE 数据库名 [OPTIONS];
例如:
CREATE DATABASE mydb1 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
注意:mysql中database和schema是一个概念,创建一个schema就是创建一个数据库,因此创建一个数据库可以改为:CREATE SCHEMA 数据库名 [OPTIONS];
修改数据库
语法:
alter database + 数据库名 + [alter_spacification] [alter_spacification]...;
删除数据库
DROP DATABASE database_name;
用户与角色
用户与角色差异:
用户可以设置密码,角色不能
用户可以登录数据库,角色不能
创建用户语法
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
参数说明:
'username':要创建的用户名。
'host':允许用户连接的主机。可以是以下值:
'localhost':只允许从本地连接。
'%':允许从任何主机连接。
具体的 IP 地址或域名:如 '192.168.1.100' 或 'example.com'。
创建用户时,如果没有指定host,默认是%
'password':用户的密码。
示例
创建一个只能从本地连接的用户
CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'mypassword';
创建一个可以从任何主机连接的用户
CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypassword';
创建一个只能从特定 IP 地址连接的用户
CREATE USER 'myuser'@'192.168.1.100' IDENTIFIED BY 'mypassword';
创建一个无密码的用户
CREATE USER 'myuser'@'localhost' IDENTIFIED BY '';
创建角色语法
与创建用户语法类似
CREATE ROLE 'roloe_name'[@'host_name'] [, 'roloe_name'[@'host_name']] ...;
host_name可以省略,如果省略host_name,则默认是%
一次性创建多个角色
CREATE ROLE 'manager','stocker','developer';
激活角色
MySQL 中创建了角色之后,默认是没有激活的,也就是不能用的,必须要 手动激活 以后用户才能拥有该角色对应的权限
激活角色有两种方式:
方式一:使用 SET DEFAULT ROLE 命令激活角色
给指定用户激活已拥有的角色权限,语法如下:
SET DEFAULT ROLE role TO user [,user ...];
方式二:将 activate_all_roles_on_login 设置为 ON
在 MySQL 中有一个系统变量 activate_all_roles_on_login 可设置对所有角色激活,在默认情况下是 OFF 关闭的状态
SET GLOBAL activate_all_roles_on_login = ON;
设置强制角色
强制角色是给每个创建账户的默认角色,不需要手动设置,强制角色无法被 REVOKE 和 DROP
方式一:服务启动前设置
在 MySQL 的配置文件 my.cnf 中进行设置
[mysqld]
mandatory_roles = 'role1,role2@localhost,role3@%'
方式二:运行时设置
语法如下:
# 重启系统后仍然有效
SET PERSIST mandatory_roles = 'role1,role2@localhost,role3@%';
# 系统重启后失效
SET GLOBAL mandatory_roles = 'role1,role2@localhost,role3@%';
注意:
创建角色不能指定密码,这点和创建用户不同
角色不能用来登录数据库
创建一个角色,默认创建一个同名用户
角色也在mysql.user这个表中存储
修改用户
mysql不支持直接修改用户名和用户的host
修改用户密码:
ALTER USER 'username'@'hostname' IDENTIFIED BY 'new_password';
SET PASSWORD FOR 'username'@'hostname' = 'new_password';
SET PASSWORD FOR user_name = 'new_password';
修改用户密码过期策略
可以设置用户密码立即过期或指定过期时间。
语法:
设置密码立即过期:
ALTER USER 'username'@'host' PASSWORD EXPIRE;
设置密码永不过期:
ALTER USER 'username'@'host' PASSWORD EXPIRE NEVER;
设置密码过期时间(天数):
ALTER USER 'username'@'host' PASSWORD EXPIRE INTERVAL n DAY;
示例:
-- 设置密码立即过期
ALTER USER 'myuser'@'localhost' PASSWORD EXPIRE;
-- 设置密码永不过期
ALTER USER 'myuser'@'localhost' PASSWORD EXPIRE NEVER;
-- 设置密码 90 天后过期
ALTER USER 'myuser'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
修改用户后要刷新权限:
FLUSH PRIVILEGES;
删除用户
drop user user_name
锁定/解锁用户
锁定用户:
ALTER USER 'username'@'host' ACCOUNT LOCK;
例如:alter user test1 account lock;
解锁用户:
ALTER USER 'username'@'host' ACCOUNT UNLOCK;
例如:alter user test1 account unlock;
授权与取消授权
授权语法
GRANT privilege_type ON database_name.table_name TO 'username'@'host' [with grant option];
参数说明:
-
privilege_type
:权限类型,如SELECT
、INSERT
、UPDATE
等。可以使用ALL PRIVILEGES
授予所有权限。 -
database_name.table_name
:指定数据库和表的名称。可以使用*.*
表示所有数据库和表,或database_name.*
表示指定数据库的所有表。 -
'username'@'host'
:指定用户名和主机。主机可以是localhost
、%
(表示任意主机)或具体 IP 地址。
常用权限类型
权限类型 | 说明 |
---|---|
ALL PRIVILEGES | 授予所有权限(除了 GRANT OPTION )。 |
SELECT | 允许查询数据。 |
INSERT | 允许插入数据。 |
UPDATE | 允许更新数据。 |
DELETE | 允许删除数据。 |
CREATE | 允许创建数据库或表。 |
DROP | 允许删除数据库或表。 |
ALTER | 允许修改表结构。 |
GRANT OPTION | 允许用户将自己的权限授予其他用户。 |
EXECUTE | 允许执行存储过程或函数。 |
INDEX | 允许创建或删除索引。 |
授权示例
示例 1:授予用户对所有数据库的所有权限
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'localhost';
示例 2:授予用户对特定数据库的所有权限
GRANT ALL PRIVILEGES ON mydatabase.* TO 'myuser'@'localhost';
示例 3:授予用户对特定表的查询权限
GRANT SELECT ON mydatabase.mytable TO 'myuser'@'localhost';
示例 4:授予用户对特定表的插入和更新权限
GRANT INSERT, UPDATE ON mydatabase.mytable TO 'myuser'@'localhost';
示例 5:授予用户对特定数据库的创建和删除权限
GRANT CREATE, DROP ON mydatabase.* TO 'myuser'@'localhost';
示例 6:授予用户对所有数据库的查询权限,并允许其将权限授予其他用户
GRANT SELECT ON *.* TO 'myuser'@'localhost' WITH GRANT OPTION;
4. 刷新权限
在授权后,需要刷新权限以使更改生效:
FLUSH PRIVILEGES;
说明:
权限范围:权限可以精确到数据库、表甚至列级别。
WITH GRANT OPTION:授予用户 GRANT OPTION 权限时需谨慎,因为该用户可以将自己的权限授予其他用户。
创建用户后该用户默认会有USAGE权限,该权限只能用于数据库登录,不能执行任何操作。
将某个或多个角色授权给用户
GRANT role1 [,role2 ...] TO user1 [,user2 ...];
查看用户/角色权限
SHOW GRANTS FOR 'yourusername'@'hostname';
撤销授权语法
REVOKE privilege_type ON database_name.table_name FROM 'username'@'host';
示例:
撤销用户 'myuser'@'localhost' 对 mydatabase.mytable 表的 SELECT 权限:
REVOKE SELECT ON mydatabase.mytable FROM 'myuser'@'localhost';
撤销用户的角色,即把某个角色从用户中取消授权:
REVOKE 'role_name'@'%' FROM 'user_name'@'%';
例如:revoke role_name from user_name
mysql默认数据库(schema)介绍
mysql有4个默认的数据库:information_schema,performance_schema,mysql,sys,其功能介绍如下:
information_schema
提供元数据信息,如数据库、表、列、索引等
这是一个元数据数据库,存储了关于MySQL服务器的所有数据库、表、列、索引和权限等信息。它通过查询系统表来提供这些信息,而不是实际存储数据。information_schema提供了访问数据库元数据的方式,包括数据库名、表名、列的数据类型、访问权限等。
常用表:
-
TABLES
:存储所有表的信息。 -
COLUMNS
:存储所有列的信息。 -
SCHEMATA
:存储所有数据库的信息。 -
STATISTICS
:存储索引的统计信息。 -
USER_PRIVILEGES
:存储用户的权限信息。 -
TABLE_PRIVILEGES:存储表授权信息
performance_schema
提供性能监控数据,如查询执行时间、锁等待、线程状态等
这个数据库用于性能监控和性能优化,提供了大量的性能相关的表供查询和分析。它可以用于监控MySQL服务器的各种性能指标,如查询性能、锁等待、I/O操作等,以便进行性能优化和故障排查。
常用表:
-
events_waits_current
:当前正在等待的事件。 -
events_statements_summary_by_digest
:按 SQL 语句摘要统计的性能数据。 -
file_summary_by_event_name
:文件 I/O 操作的统计信息。 -
mutex_instances
:互斥锁的信息。
mysql
是mysql默认的数据库,登录mysql数据库时,如果没有指定登录的数据库,就默认登录到这个数据库
存储了用户账户信息、权限配置、密码和其他全局级别的控制信息。通过该数据库,可以管理和配置MySQL服务器的各种参数和设置。它包含了用户权限、数据库权限、表权限等信息。
常用表:
-
user
:存储用户账户和全局权限。 -
db
:存储数据库级别的权限。 -
tables_priv
:存储表级别的权限。 -
columns_priv
:存储列级别的权限。 -
time_zone
:存储时区信息。
sys
提供基于 performance_schema 的高级性能分析工具和视图
这是MySQL8.0版本引入的新数据库,提供了一系列视图和存储过程,用于简化和优化对MySQL服务器的监控和管理。通过sys数据库,可以方便地获取各种数据库对象的信息,并进行性能分析和诊断。
常用视图:
-
schema_table_statistics
:按表和模式统计的性能数据。 -
statement_analysis
:SQL 语句的性能分析。 -
user_summary
:按用户统计的性能数据。
备份与恢复
备份
语法:
mysqldump -P + 端口号 + -u 用户名+ -h 主机名 + -p + 密码 + -B + 数据库名 > 新创建的文件名