Mysql 管理

oneNeko 于 2021-10-13 发布

Mysql常用管理操作语句,以下操作均在mysql8.0下执行

用户操作

基本操作

使用root用户登录,运行以下命令

# 创建一个名为`test`密码为`1234`的用户:
create user test identified by '1234';

# 查询用户以及host
select user,host from mysql.user;

# 修改用户允许登录的主机
# % 代表所有主机
# localhost 代表只能在本机登录
# 192.168.1.1 代表只能在192.168.1.1这个ip登录
update mysql.user set host = 'localhost' where user = 'test';

# 修改用户密码
alter user 'test'@'localhost' identified by 'pswd';

# 重命名用户
rename user test to test1;

# 删除用户test
drop user 'test'@'localhost';

权限操作

查询用户权限

# 查询当前用户权限
show grants;

# 查询其他用户权限
show grants for test;
select * from mysql.user where user='test';

授予用户权限

# 授予用户权限。
grant privilegesCode on dbName.tableName to username@host;

# 撤销用户权限。
revoke privilegesCode on dbName.tableName from username@host;

dbName.tableName表示授予权限的具体库和表

username@host表示授予的用户以及允许该用户登录的IP地址。

flush privileges表示刷新权限变更。

privilegesCode表示权限类型,可以授予或撤销的每个权限如下

权限 说明(无说明则默认字面意义)
ALL 除GRANT OPTION外的所有权限
ALTER  
ALTER ROUTINE 使用ALTER PROCEDURE和DROPPROCEDURE
CREATE  
CREATE TEMPORARY TABLES  
CREATE USER 使用CREATE USER、DROP USER、RENAME USER和REVOKE ALL PRIVILEGES
CREATE VIEW  
DELETE  
DROP  
EXECUTE 使用CALL和存储过程
FILE 使用SELECT INTO OUTFILE和LOAD DATA INFILE
GRANT OPTION 使用GRANT和REVOKE
INDEX 使用CREATE INDEX和DROP INDEX
INSERT  
LOCK TABLES  
PROCESS 使用SHOW FULL PROCESS LIST
RELOAD 使用FLUSH
REPLICATION CLIENT 服务器位置的访问
REPLICATION SLAVE 由复制丛书使用
SELECT  
SHOW DAYABASES  
SHOW VIEW 使用SHOW CREATE VIEW
SHUTDOWN 使用mysqladmin shutdown(用来关闭MySQL)
SUPER 使用CHANGE MASTER、KILL、LOGS、PURGE、MASTER和SET GLOBAL。还允许mysqladmin调试登录
UPDATE  
USAGE 无访问权限

注意事项

grant,revoke用户权限后,该用户只有重新连接数据库,权限才能生效。如果想让授权的用户,也可以将这些权限grant给其他用户,需要选项 grant option

grant select on testdb.* to dba@localhost with grant option;

数据库维护

# ANALYZE TABLE用来检查表键是否正确
mysql> analyze table users;
+-----------------------+---------+----------+----------+
| Table                 | Op      | Msg_type | Msg_text |
+-----------------------+---------+----------+----------+
| test.users            | analyze | status   | OK       |
+-----------------------+---------+----------+----------+

# CHECK TABLE 用来针对许多问题对标进行检查
#   CHANGED 检查自最后一次检查以来改动过的表
#   EXTENDED 检查所有被删除的连接并进行键检验
#   QUICK 只进行快速扫描
mysql> check table users,orders extended;
+-------------------------+-------+----------+----------+
| Table                   | Op    | Msg_type | Msg_text |
+-------------------------+-------+----------+----------+
| test.users              | check | status   | OK       |
| test.orders             | check | status   | OK       |
+-------------------------+-------+----------+----------+

如果从一个表中删除大量数据,应该使用OPTIMIZE TABLE来收回所用的控件,从而优化表的性能

诊断启动问题

查看日志文件

使用日志时,可用FLUSH LOGS语句来刷新和重新开始所有日志文件

备份和还原

mysqldumpmysql自带的逻辑备份工具。它的备份原理是通过协议连接到mysql数据库,将需要备份的数据查询出来,将查询出的数据转换成对应的insert语句,当我们需要还原这些数据时,只要执行这些insert语句,即可将对应的数据还原。

备份

命令格式如下:

mysqldump [选项] 数据库名 [表名] > 脚本名
mysqldump [选项] --数据库名 [选项 表名] > 脚本名
mysqldump [选项] --all-databases [选项]  > 脚本名
参数名 缩写 含义
–host -h 服务器地址
–port -P 服务器端口号
–user -u mysql用户名
–password -p mysql密码
–databases   指定要备份的数据库
–compact   压缩模式,产生更少输出
–comments   添加注释信息
–complete-insert   输出完成的插入语句
–lock-tables   备份前,锁定所有数据库表
–no-create-db/–no-create-info   禁止生成创建数据库语句
–force   当出现错误是仍然继续备份操作
–default-character-set   指定默认字符集
–add-locks   备份时锁定数据库表

还原

# 系统行命令
mysqladmin -uroot -p create db_name 
mysql -uroot -p  db_name < /backup/mysqldump/db_name.db

注:在导入备份数据库前,db_name如果没有,是需要创建的; 而且与db_name.db中数据库名是一样的才可以导入。
# soure 方法
use db_name
source /backup/mysqldump/db_name.db

查看容量

# 查看所有数据库容量大小
select 
table_schema as '数据库',
sum(table_rows) as '记录数',
sum(truncate(data_length/1024/1024, 2)) as '数据容量(MB)',
sum(truncate(index_length/1024/1024, 2)) as '索引容量(MB)'
from information_schema.tables
group by table_schema
order by sum(data_length) desc, sum(index_length) desc;

# 查看所有数据库各表容量大小
select 
table_schema as '数据库',
table_name as '表名',
table_rows as '记录数',
truncate(data_length/1024/1024, 2) as '数据容量(MB)',
truncate(index_length/1024/1024, 2) as '索引容量(MB)'
from information_schema.tables
order by data_length desc, index_length desc;

# 查看指定数据库容量大小
select 
table_schema as '数据库',
sum(table_rows) as '记录数',
sum(truncate(data_length/1024/1024, 2)) as '数据容量(MB)',
sum(truncate(index_length/1024/1024, 2)) as '索引容量(MB)'
from information_schema.tables
where table_schema='mysql';

改善性能

# 查看当前设置
mysql>SHOW VARIABLES;
mysql>SHOW STATUS;

# 查看活动进程,可以使用KILL终结某个进程
mysql>SHOW PROCESSLIST;

# 使用EXPLAIN让MySQL解释它如何执行一条SQL语句
mysql> explain select * from test.users;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
|  1 | SIMPLE      | users | NULL       | ALL  | NULL          | NULL | NULL    | NULL |  145 |   100.00 | NULL  |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+

参考

MySql授权和撤销权限操作 MySQL之mysqldump的使用 MySQL查看数据库表容量大小