记录 MySQL 在日常运维中可能会使用到的命令、Sql语句。
全库备份
mysqldump \
-h MYSQL_IP \
-u MYSQL_ADMIN_USER \
-p MYSQL_ADMIN_PASSWORD \
--socket /var/run/mysql/default.mysql.socket \
--skip-opt \
--create-options \
--single-transaction \
-q \
--no-autocommit \
-R \
--triggers \
--default-character-set=utf8 \
--all-databases | gzip > /dbbak/all_db_$(date +%Y%m%d_%H%M%S).gz;
单库备份
mysqldump \
-h MYSQL_IP \
-u MYSQL_ADMIN_USER \
-p MYSQL_ADMIN_PASSWORD \
--socket /var/run/mysql/default.mysql.socket \
--skip-opt \
--create-options \
--single-transaction \
-q \
--no-autocommit \
-R \
--triggers \
--default-character-set=utf8 \
--events 库名| gzip > /dbbak/库名_$(date +%Y%m%d_%H%M%S).gz;
参数介绍
# 3. 还原 testdb 数据库
gunzip /dbbak/库名_$(date +%Y%m%d_%H%M%S).gz
mysql \
-h$BK_MYSQL_IP \
-u$BK_MYSQL_ADMIN_USER \
-p$BK_MYSQL_ADMIN_PASSWORD \
--socket /var/run/mysql/default.mysql.socket \
库名 < /data/dbbak/库名_$(date +%Y%m%d_%H%M%S)
0. 创建 MySQL 用户, 并设置密码为 MYSQL2023.
CREATE USER 'user1'@'localhost' IDENTIFIED BY ' MYSQL2023.';
-- 注:'user1'@'localhost' 和 'user1'@'127.0.0.1' 会被识别为两个不同的用户
1.修改用户密码
ALTER USER 'myuser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'newpassword'
2. 查看所有用户信息
SELECT user,host FROM mysql.user;
3. 删除用户
DROP USER 'user1'@'localhost';
4. 创建密码为 MYSQL2023. 的用户 user1,并赋予其对所有数据库有所有的操作权限(ALL)
-- 注意mysql8创建用户和授权需要分开执行
GRANT ALL ON *.* TO 'user1'@'%' IDENTIFIED BY ' MYSQL2023.' WITH GRANT OPTION;
FLUSH PRIVILEGES; -- 刷新权限
5. 创建密码为 MYSQL2023. 的用户 user2,并赋予其对所有数据库只有只读权限(SELECT)
GRANT SElECT ON *.* TO 'user2'@'%' IDENTIFIED BY " MYSQL2023.";
FLUSH PRIVILEGES; -- 刷新权限
6. 查看 user1 的权限
SHOW GRANTS FOR 'user1'@'%';
7. 创建数据库(如果不存在)
CREATE DATABASE IF NOT EXISTS dbname DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
8. 查看所有数据库
SHOW DATABASES;
9. 查看数据库的建库语句
SHOW CREATE DATABASE dbname;
10. 查看某表的创建语句
SHOW CREATE TABLE tablename;
11. 查看所有数据库大小
SELECT
table_schema AS '数据库',
SUM(table_rows) AS '记录数',
SUM(TRUNCATE(data_length/1024/1024/1024, 2)) AS '数据容量(GB)',
SUM(TRUNCATE(index_length/1024/1024/1024, 2)) AS '索引容量(GB)'
FROM
information_schema.tables
GROUP BY
table_schema
ORDER BY
SUM(data_length) DESC,
SUM(index_length) DESC;
12. 查看某个库中的表大小
SELECT
table_schema AS '数据库',
table_name AS '表名',
table_rows AS '记录数',
TRUNCATE(data_length/1024/1024/1024, 2) as '数据容量(GB)',
TRUNCATE(index_length/1024/1024/1024, 2) as '索引容量(GB)'
FROM
information_schema.tables
WHERE
table_schema='表名称' /* 数据库名 */
ORDER BY
table_rows DESC,
index_length DESC;
13. 查询当前 MySQL 版本
SELECT @@VERSION;
14. 查询定义的packet大小
select @@max_allowed_packet;
15. 查看当前mysqld的所有参数,包括默认值
SHOW VARIABLES;
16. 查询当前 MySQL 实例的端口
SHOW VARIABLES LIKE 'port';
17. 查询 MySQL 实例的 socket 文件路径
SHOW VARIABLES LIKE 'socket';
18. 查看实例的数据路径
SHOW VARIABLES LIKE 'datadir';
19. 查看是否开启了慢查询日志, 以及慢日志的路径, ON代表开启
SHOW VARIABLES LIKE 'slow_query_log%';
20. 查看从服务器是否开启慢查询日志,ON代表开启
SHOW VARIABLES LIKE 'log_slow_slave_statements';
21. 查看慢查询时间,查询超过这个时间即被标记为慢查询
SHOW VARIABLES LIKE 'long_query_time';
22. 在线开启慢日志
SET GLOBAL slow_query_log=1;
23. 在线修改慢日志路径
SET GLOBAL slow_query_log_file='/tmp/slow.log';
24. 在线修改慢日志查询时间
SET GLOBAL long_query_time=0.2; /* 需要重新登录命令行 */
25. 查看日志的输出格式
SHOW VARIABLES LIKE 'log_output'; /* FILE 或 TABLE */
26. 查看日志的时间信息
SHOW VARIABLES LIKE 'log_timestamps'; /* UTC时间或者SYSTEM时间 */
27. 查看是否开启 '将没有使用索引的SQL语句记录到慢查询日志中' 的功能
SHOW VARIABLES LIKE 'log_queries_not_using_indexes';
28. 限制每分钟内,在慢查询日志中,记录没有使用索引的次数
/* 一般与上面的参数一起使用, 避免日志快速增长。 */
SHOW VARIABLES LIKE 'log_throttle_queries_not_using_indexes';
29. 查看创建的临时表的存储引擎类型
SHOW VARIABLES LIKE "default%tmp%";
30. 查询log文件大小
SHOW VARIABLES LIKE 'innodb_log_file_size';
31. 查询页的大小
/*
1) 一旦数据库通过innodb_page_size设置完成,则后续无法更改,
2) innodb_page_size 是针对普通表的,压缩表不受限制。
*/
SHOW VARIABLES LIKE 'innodb_page_size';
32. 查看缓冲池的大小
/*
1) 每次读写数据都是通过buffer pool,当buffer pool中没有所需的数据时,才去硬盘中获取。
2) 该值设置的越大越好,buffer pool也是以页(page)为单位的,且大小和innodb_page_size一致。
*/
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
33. 在线调整innodb_buffer_pool_size
/* MySQL 5.7之前的版本,修改该值,需要重启 */
SET GLOBAL innodb_buffer_pool_size=2*1024*1024*1024;
34. 设置了多少个缓冲池
/* 设置多个instance可将热点打散,提高并发性能(建议设置成cpu 个数值) */
SHOW VARIABLES LIKE 'innodb_buffer_pool_instances';
35. 是否在停机时 dump 出 buffer pool数据
/*
在MySQL 5.6 以后,可以在停机的时候dump出buffer pool的数据,然后在启动的时候Load进buffer pool。该功能可以在MySQL启动时自动预热,无需人工干预。
*/
SHOW VARIABLES LIKE 'innodb_buffer_pool_dump_at_shutdown';
36. 启动时加载dump的文件
/* 恢复到buffer pool中。dump的越多,启动的越慢 */
SHOW VARIABLES LIKE 'innodb_buffer_pool_load_at_startup';
37. 查看 dump 百分比
/* 是每个buffer pool文件,而不是整体 */
SHOW VARIABLES LIKE 'innodb_buffer_pool_dump_pct';
38. 查看隔离级别
SHOW VARIABLES LIKE 'transaction_isolation';
39. 设置隔离级别
SEt transaction_isolation='read-committed';
40. 是否将死锁信息打印到err_log中
SHOW VARIABLES LIKE 'innodb_print_all_deadlocks';
41. master thread 每秒刷新redo的buffer到logfile
/* 5.7版本可以设置刷新间隔时间, 默认是1秒。 */
SHOW VARIABLES LIKE "%innodb_flush_log_at_timeout%";
42. 查看binlog的类型
/*
STATEMENT: 记录SQL语句
ROW: 记录SQL语句操作的那些行(行的变化)
MIXED: mixed 混合statement 和 Row 格式(不推荐)。
*/
SHOW VARIABLES LIKE 'binlog_format';
43. 查看timeout参数
SHOW VARIABLES LIKE "%timeout%"
44. 查看最大连接数
SHOW VARIABLES LIKE 'max_connections';
45. 查看 binlog 过期时间
show variables like 'expire_logs_days';
46. 修改 binlog 过期时间
set global expire_logs_days=7;
47. 显示表结构和列结构的命令
DESC dbname.tablename;
48. 显示正在执行的线程
SHOW PROCESSLIST;
49. 查看buffer pool的状态
SHOW ENGINE INNODB STATUS\\G;
50. 查看表的索引情况
SHOW INDEX FROM tablename;
51. 查看锁的信息
SELECT * FROM sys.innodb_lock_waits;
52. 查看 master 状态
SHOW MASTER STATUS\\G; /*在主节点上执行*/
53. 查看所有的log文件
SHOW MASTER LOGS; /*在主节点上执行*/
54. 查看 slave 状态
SHOW SLAVE STATUS\\G; /*在从节点上执行*/
55. 在线清理 mysql-bin3306.000003 之前的日志
PURGE BINARY LOGS TO 'mysql-bin3306.000003';
-- 1. 字段和表中的顺序一致 ,DEFAULT代表使用该列的默认值
INSERT INTO tbl_name VALUES (值1), (值2), (DEFAULT);
-- 2. 字段顺序打乱,字段与值一一对应
INSERT INTO tbl_name (字段3, 字段2, 字段1) VALUES (值3, 值2, 值1);
-- 3. set实现
INSERT INTO tbl_name set 字段1=值1,字段2=值2,字段3=值3
-- 如果主键冲突,则更新后面的字段
INSERT INTO tbl_name VALUES (值1), (值2), (值3) DUPLICATE KEY UPDATE 字段=值, …;
-- 如果主键冲突,则跳过该行插入
INSERT IGNORE INTO tbl_name ...
UPDATE tab_name SET 字段=值, 字段=值 WHERE 字段=值;
DELETE FROM tab_name WHERE 字段=值;
-- 删除表中某一列值重复的项,只保留最小id的
DELETE FROM tab_name a, tab_name b where a.id > b.id and a.字段=b.字段
执行顺序为:FROM > WHERE > GROUP BY > HAVING > ORDER BY > SELECT
SELECT 查询的内容 FROM tab_name WHERE 查询条件 GROUP BY 分组字段 HAVING 分组后的条件 ORDER BY 字段;
-- 连接查询
-- 拼接结果
union -- 对两个集合(结果)进行并集操作
union all -- 可以有重复的并集
子查询:一个select查询的结果作为另一个查询的条件
SELECT * FROM tab_name1 where tid IN (SELECT id from tab_name2 WHERE xxx > x)
连接查询:通过某一字段将两表连接,通过不同的连接方式展示查询结果
-- 内连接:取两表交集
SELECT * FROM tab_name1 a JOIN tab_name2 b ON a.aid = b.bid
-- 其实等同于
SELECT * FROM tab_name1 a ,tab_name2 b WHERE a.aid = b.bid
-- 外连接-左连接:以左表为主取值,查出的结果条数=左表的总条数
SELECT * FROM tab_name1 a LEFT JOIN tab_name2 b ON a.aid = b.bid
-- 外连接-右连接:以右表为主取值,查出的结果条数=右表的总条数
SELECT * FROM tab_name1 a RIGHT JOIN tab_name2 b ON a.aid = b.bid
-- 内置函数
abs(x) -- 绝对值
format(x, d) -- 格式化千分位数值 format(1234567.456, 2) = 1,234,567.46
ceil(x) -- 向上取整
floor(x) -- 向下取整
round(x) -- 四舍五入去整
mod(m, n) -- m%n 求余
pi() -- 获得圆周率
pow(m, n) -- m^n
sqrt(x) -- 算术平方根
rand() -- 随机数
-- 时间相关
now(), current_timestamp(); -- 当前日期时间
current_date(); -- 当前日期
current_time(); -- 当前时间
date( yyyy-mm-dd hh:ii:ss ); -- 获取日期部分
time( yyyy-mm-dd hh:ii:ss ); -- 获取时间部分
-- 双分支 类似java的三元 expr为表达式
if(expr1,expr2,expr3) -- expr1成立则返回expr2的值,反之返回expr3的值
-- 聚合函数
count() -- 计数
sum() -- 求和
max() -- 最大值
min() -- 最小值
avg() -- 平均值
-- 分组 类似于java中stream的groupingby
group_concat([DISTINCT] column1 [ORDER BY column2 ASC\DESC] [SEPARATOR seq]);-- 将分组中column1这一列对应的多行的值 [去重] 按照column2 升序或者降序进行连接,其中分隔符为seq