1. MySQL命令全景解析:从入门到高效管理
作为一名数据库管理员,我整理这份MySQL命令手册的初衷很简单:让开发者能快速找到最常用的操作指令,同时理解每个命令背后的设计逻辑。不同于官方文档的全面但冗长,这份指南聚焦实际工作场景中的高频需求,包含了我十年运维中积累的200+核心命令和实用技巧。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础操作命令精要
2.1 数据库生命周期管理
sql复制-- 创建指定字符集的数据库
CREATE DATABASE shop DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 安全删除数据库(需确认操作)
DROP DATABASE IF EXISTS legacy_db;
注意:生产环境执行DROP前务必先备份,建议使用IF EXISTS避免报错中断脚本
字符集选择直接影响数据存储效率,utf8mb4是当前支持emoji和生僻字的最佳选择。我曾遇到客户投诉用户昵称显示问号,最终发现是使用了不完整的utf8字符集导致。
2.2 表结构操作实战
sql复制-- 创建包含索引和约束的订单表
CREATE TABLE orders (
id INT AUTO_INCREMENT PRIMARY KEY,
order_no VARCHAR(32) NOT NULL UNIQUE,
user_id INT NOT NULL,
amount DECIMAL(10,2) CHECK (amount > 0),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
) ENGINE=InnoDB;
-- 在线修改大表结构(5.6+版本)
ALTER TABLE orders ADD COLUMN payment_method TINYINT COMMENT '1-支付宝 2-微信' AFTER amount, ALGORITHM=INPLACE, LOCK=NONE;
在电商系统升级时,ALGORITHM=INPLACE参数帮助我们在2000万记录的订单表上无感添加字段,避免了传统方式导致的4小时停机。
3. 数据操作进阶技巧
3.1 高效查询方案
sql复制-- 分页查询优化(避免深分页)
SELECT * FROM products WHERE status=1 AND id > 10000 ORDER BY id LIMIT 20;
-- 使用窗口函数统计部门薪资排名
SELECT
name, department, salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dept_rank
FROM employees;
当处理百万级用户数据分页时,传统LIMIT 100000,20会导致严重性能问题。改用WHERE条件过滤后,查询时间从8秒降至0.02秒。
3.2 事务与锁机制
sql复制-- 账户转账事务模板
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;
-- 模拟业务逻辑检查
SELECT SLEEP(3);
COMMIT;
金融系统中,我曾遇到因未正确处理事务隔离级别导致的余额错乱。现在所有资金操作都明确指定隔离级别:
sql复制SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
4. 运维管理核心命令
4.1 用户与权限体系
sql复制-- 创建带IP限制的管理员账号
CREATE USER 'audit_admin'@'192.168.1.%' IDENTIFIED BY 'ComplexPwd123!';
GRANT SELECT, SHOW VIEW ON shop.* TO 'audit_admin'@'192.168.1.%';
FLUSH PRIVILEGES;
-- 查看用户实际权限(比SHOW GRANTS更直观)
SELECT * FROM mysql.user WHERE user LIKE 'audit%'\G
权限管理最容易犯的错误是过度授权。去年某次安全审计发现,开发账号拥有SUPER权限导致严重风险,现在严格执行最小权限原则。
4.2 备份恢复策略
bash复制# 热备份方案(需安装percona-xtrabackup)
xtrabackup --backup --target-dir=/backups/full/ --user=backup_user --password=S3cureP@ss
# 单表恢复流程
mysql -e "CREATE TABLE orders_new LIKE orders;"
ALTER TABLE orders_new DISCARD TABLESPACE;
cp /backups/shop/orders.ibd /var/lib/mysql/shop/orders_new.ibd
ALTER TABLE orders_new IMPORT TABLESPACE;
去年主库故障时,我们通过xtrabackup在15分钟内完成1TB数据库的恢复,RTO远低于传统mysqldump方案。
5. 性能优化命令宝典
5.1 执行计划分析
sql复制-- 深度解析查询性能
EXPLAIN FORMAT=JSON
SELECT p.* FROM products p
JOIN categories c ON p.category_id = c.id
WHERE c.name = '电子产品';
-- 查看索引使用统计
SELECT index_name, rows_selected, rows_inserted
FROM sys.schema_index_statistics
WHERE table_schema = 'shop';
通过EXPLAIN发现某商品列表查询未使用category_id索引,添加覆盖索引后QPS从50提升到1200。
5.2 参数调优模板
sql复制-- 临时调整内存参数(重启失效)
SET GLOBAL sort_buffer_size = 8*1024*1024;
SET GLOBAL read_rnd_buffer_size = 4*1024*1024;
-- 持久化配置(my.cnf)
[mysqld]
innodb_buffer_pool_size = 12G
innodb_log_file_size = 2G
内存配置需要根据服务器规格调整,我们通过监控发现buffer_pool命中率低于90%后,将其从8G调整到12G,查询缓存命中率提升35%。
6. 监控诊断实战命令
6.1 实时状态监控
sql复制-- 查看当前连接详情
SELECT * FROM sys.session
WHERE command != 'Sleep'
ORDER BY time_ms DESC LIMIT 10;
-- 锁等待分析
SELECT * FROM sys.innodb_lock_waits
WHERE wait_age_secs > 5;
6.2 性能瓶颈定位
sql复制-- 慢查询日志分析(需先开启)
SELECT * FROM mysql.slow_log
WHERE start_time > NOW() - INTERVAL 1 HOUR
ORDER BY query_time DESC;
-- 表空间分析
SELECT table_schema, table_name,
ROUND(data_length/1024/1024,2) AS data_mb,
ROUND(index_length/1024/1024,2) AS index_mb
FROM information_schema.tables
ORDER BY (data_length+index_length) DESC;
上周通过分析slow_log发现一个未使用索引的统计查询,优化后每日减少50万次全表扫描。
7. 高可用架构命令集
7.1 主从复制配置
sql复制-- 在主库创建复制账号
CREATE USER 'repl'@'%' IDENTIFIED BY 'ReplPwd123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
-- 在从库配置复制链路
CHANGE MASTER TO
MASTER_HOST='master01',
MASTER_USER='repl',
MASTER_PASSWORD='ReplPwd123!',
MASTER_AUTO_POSITION=1;
START SLAVE;
7.2 主从切换流程
sql复制-- 原主库降级为从库
STOP SLAVE;
RESET SLAVE ALL;
CHANGE MASTER TO MASTER_HOST='new_master';
START SLAVE;
-- 新主库提升
STOP SLAVE;
RESET MASTER;
SET GLOBAL read_only=OFF;
去年双11前我们通过GTID方式完成主从切换,整个过程仅耗时28秒,业务几乎无感知。
8. 开发辅助命令大全
8.1 存储过程调试
sql复制-- 创建带错误处理的支付流程
DELIMITER //
CREATE PROCEDURE process_payment(IN order_id BIGINT)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1 @err_no = MYSQL_ERRNO;
INSERT INTO payment_errors VALUES(order_id, @err_no, NOW());
ROLLBACK;
END;
START TRANSACTION;
-- 业务逻辑
COMMIT;
END //
DELIMITER ;
8.2 JSON数据处理
sql复制-- 提取JSON数组中的特定元素
SELECT
order_no,
JSON_EXTRACT(customer_info, '$.mobile') AS phone,
JSON_LENGTH(items) AS item_count
FROM orders
WHERE JSON_CONTAINS(items, '{"category":"电子产品"}');
现在订单系统的扩展属性全部采用JSON存储,相比传统的EAV模型,查询性能提升近10倍。
9. 安全加固关键命令
9.1 密码策略强化
sql复制-- 启用密码复杂度验证
INSTALL COMPONENT 'file://component_validate_password';
SET GLOBAL validate_password.policy=STRONG;
-- 定期密码轮换
ALTER USER 'app_user'@'%' PASSWORD EXPIRE INTERVAL 90 DAY;
9.2 审计日志配置
sql复制-- 安装审计插件(企业版)
INSTALL PLUGIN audit_log SONAME 'audit_log.so';
SET GLOBAL audit_log_format=JSON;
SET GLOBAL audit_log_policy=ALL;
去年通过审计日志发现某外包人员异常查询用户隐私数据,及时阻止了数据泄露风险。
10. 云数据库特别指南
10.1 RDS常用管理
sql复制-- 查看实例参数组
CALL mysql.rds_show_configuration();
-- 设置延迟复制(用于灾备)
CALL mysql.rds_set_source_delay(3600);
10.2 只读实例扩展
sql复制-- 创建跨AZ只读实例(AWS RDS)
CALL mysql.rds_create_read_replica(
'shop-replica-us-west',
'shop-main',
'us-west-2a'
);
在促销活动前,我们通过快速增加只读实例将数据库吞吐量提升了4倍,活动结束后即可删除节省成本。
11. 版本升级注意事项
11.1 5.7到8.0升级检查
sql复制-- 检查不兼容的表结构
SELECT TABLE_SCHEMA, TABLE_NAME, ENGINE
FROM information_schema.tables
WHERE ENGINE = 'MyISAM';
-- 验证密码插件兼容性
SELECT user, plugin FROM mysql.user
WHERE plugin = 'mysql_native_password';
升级前必须测试所有存储过程,我们曾遇到GROUP BY语义变化导致的报表错误。
12. 实用工具命令整合
12.1 mysqladmin快捷操作
bash复制# 实时监控QPS变化
mysqladmin -uroot -p extended-status -i10 | grep Questions
# 安全关闭数据库
mysqladmin -uroot -p shutdown
12.2 mysqldump高级用法
bash复制# 导出存储过程和函数
mysqldump --routines --no-data shop > procedures.sql
# 并行导出大表
mydumper -u backup_user -p xxx -B shop -T large_table -o /backups
13. 性能测试必备命令
13.1 基准测试工具
bash复制# 执行OLTP测试
sysbench oltp_read_write \
--db-driver=mysql \
--mysql-host=127.0.0.1 \
--mysql-user=test \
--mysql-password=test \
--mysql-db=sbtest \
--tables=10 \
--table-size=1000000 \
prepare
13.2 压力测试分析
sql复制-- 查看线程池状态
SELECT * FROM performance_schema.thread_pool_status;
-- 分析表IO热点
SELECT * FROM sys.io_global_by_file_by_bytes
WHERE file LIKE '%shop/%'
ORDER BY total DESC;
14. 故障排查命令手册
14.1 死锁分析流程
sql复制-- 查看最近死锁记录
SHOW ENGINE INNODB STATUS\G
-- 主动监控死锁
SELECT * FROM performance_schema.events_statements_history_long
WHERE digest_text LIKE '%FOR UPDATE%';
14.2 连接数暴增处理
sql复制-- 快速查看连接来源
SELECT * FROM sys.host_summary
ORDER BY current_connections DESC;
-- 批量终止异常连接
SELECT CONCAT('KILL ',id,';')
FROM information_schema.processlist
WHERE user='web_user' AND time>300
INTO OUTFILE '/tmp/kill.sql';
source /tmp/kill.sql;
15. 数据迁移专项命令
15.1 大表迁移方案
bash复制# 使用mydumper并行导出
mydumper -u mig_user -p xxx -B old_db -T big_table -o /migrate
# 使用loader快速导入
loader -u mig_user -p xxx -B new_db -d /migrate
15.2 跨版本迁移校验
sql复制-- 数据一致性检查(pt-table-checksum)
SELECT
db, tbl,
SUM(this_cnt) AS total_rows,
COUNT(*) AS chunks
FROM checksums
WHERE master_cnt <> this_cnt
GROUP BY db, tbl;
16. 数据加密最佳实践
16.1 透明数据加密
sql复制-- 创建加密表空间
CREATE TABLESPACE `secure_ts`
ADD DATAFILE 'secure_ts.ibd'
ENCRYPTION='Y';
-- 迁移敏感数据到加密表空间
ALTER TABLE customers
TABLESPACE=secure_ts;
16.2 列级加密方案
sql复制-- 使用AES加密身份证号
INSERT INTO users (id_card)
VALUES (TO_BASE64(AES_ENCRYPT('110101199003072134', 'encryption_key')));
-- 查询时解密
SELECT AES_DECRYPT(FROM_BASE64(id_card), 'encryption_key')
FROM users WHERE id=1;
17. 分布式架构命令
17.1 分片集群管理
sql复制-- 查看分片状态(MySQL Cluster)
NDB> SHOW;
-- 添加数据节点
NDB> ADD NODE 5:192.168.10.5;
17.2 组复制配置
sql复制-- 初始化组复制
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
-- 查看组成员
SELECT * FROM performance_schema.replication_group_members;
18. 数据仓库集成方案
18.1 增量数据捕获
sql复制-- 开启binlog为ROW模式
SET GLOBAL binlog_format=ROW;
-- 查看binlog事件
SHOW BINLOG EVENTS IN 'mysql-bin.000012' FROM 12345 LIMIT 10;
18.2 与Hadoop集成
bash复制# 使用Sqoop导入数据
sqoop import \
--connect jdbc:mysql://mysql01:3306/shop \
--username etl_user \
--password xxx \
--table orders \
--target-dir /data/warehouse/orders
19. 自动化运维脚本
19.1 日常检查脚本
bash复制#!/bin/bash
# 数据库健康检查
mysql -uroot -p -e "
SHOW GLOBAL STATUS LIKE 'Threads_connected';
SHOW ENGINE INNODB STATUS\G
SELECT * FROM sys.memory_global_total;
" > /var/log/mysql_health.log
19.2 自动备份方案
bash复制#!/bin/bash
# 全量+binlog备份脚本
BACKUP_DIR="/backups/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR
xtrabackup --backup --target-dir=$BACKUP_DIR/full
mysql -uroot -p -e "FLUSH BINARY LOGS;"
cp /var/lib/mysql/mysql-bin.* $BACKUP_DIR/
20. 新特性应用实例
20.1 窗口函数实战
sql复制-- 计算移动平均销售额
SELECT
date,
amount,
AVG(amount) OVER (ORDER BY date RANGE BETWEEN INTERVAL 7 DAY PRECEDING AND CURRENT ROW) AS weekly_avg
FROM daily_sales;
20.2 公用表表达式
sql复制-- 递归查询组织架构
WITH RECURSIVE org_tree AS (
SELECT id, name, parent_id FROM departments WHERE id=1
UNION ALL
SELECT d.id, d.name, d.parent_id
FROM departments d JOIN org_tree ot ON d.parent_id=ot.id
)
SELECT * FROM org_tree;
21. 最佳实践总结
21.1 命令使用原则
- 生产环境执行DDL前务必在测试环境验证
- 重要操作前使用START TRANSACTION开启事务
- 批量操作时添加LIMIT子句控制影响范围
- 长期运行命令使用nohup或screen保护会话
21.2 性能优化要点
- 查询首先关注执行计划而非SQL写法
- 索引不是越多越好,维护需要成本
- 80%的性能问题通过优化前10%的慢查询解决
- 定期分析表(ANALYZE TABLE)更新统计信息
22. 资源监控与调优
22.1 实时性能监控
sql复制-- 查看当前资源消耗TOP SQL
SELECT * FROM sys.statement_analysis
ORDER BY avg_latency DESC
LIMIT 10;
-- 内存分配详情
SELECT * FROM sys.memory_by_host_by_current_bytes
WHERE host='localhost';
22.2 参数动态调整
sql复制-- 临时加大连接数限制
SET GLOBAL max_connections=500;
-- 调整InnoDB刷新策略
SET GLOBAL innodb_io_capacity=2000;
SET GLOBAL innodb_io_capacity_max=4000;
23. 空间回收与管理
23.1 表空间优化
sql复制-- 重建表释放碎片空间
ALTER TABLE orders ENGINE=InnoDB;
-- 收缩undo表空间
SET GLOBAL innodb_undo_log_truncate=ON;
SET GLOBAL innodb_purge_rseg_truncate_frequency=128;
23.2 大表归档方案
sql复制-- 创建归档表(相同结构)
CREATE TABLE orders_archive LIKE orders;
-- 数据迁移(分批处理)
INSERT INTO orders_archive
SELECT * FROM orders
WHERE created_at < '2020-01-01'
LIMIT 10000;
24. 元数据管理技巧
24.1 数据字典查询
sql复制-- 查看列注释信息
SELECT column_name, column_comment
FROM information_schema.columns
WHERE table_schema='shop';
-- 生成ER图DDL
SELECT
TABLE_NAME,
GROUP_CONCAT(COLUMN_NAME ORDER BY ORDINAL_POSITION)
FROM information_schema.columns
WHERE table_schema='shop'
GROUP BY TABLE_NAME;
24.2 模式变更追踪
sql复制-- 查看表结构变更历史
SELECT * FROM mysql.schemata
WHERE schema_name='shop';
-- 对比开发与生产环境差异
SELECT * FROM
(SELECT table_name, column_name FROM dev_schema.columns) dev
LEFT JOIN
(SELECT table_name, column_name FROM prod_schema.columns) prod
ON dev.table_name=prod.table_name AND dev.column_name=prod.column_name
WHERE prod.column_name IS NULL;
25. 跨平台操作指南
25.1 Windows特别配置
sql复制-- 解决路径反斜杠问题
LOAD DATA INFILE 'C:/temp/import.csv'
INTO TABLE products
FIELDS TERMINATED BY ',';
-- 设置服务启动参数
mysqld --install MySQL --defaults-file=C:\my.ini
25.2 Docker环境管理
bash复制# 快速启动测试实例
docker run -d --name mysql_test \
-e MYSQL_ROOT_PASSWORD=test123 \
-p 3306:3306 mysql:8.0
# 执行备份操作
docker exec mysql_test mysqldump -uroot -ptest123 shop > backup.sql
26. 客户端工具集成
26.1 MySQL Workbench技巧
sql复制-- 可视化执行计划分析
EXPLAIN FORMAT=TREE
SELECT * FROM products WHERE price>100;
-- 模式比较工具
-- 使用Utilities → Schema Comparison生成差异脚本
26.2 VS Code插件配置
json复制// settings.json配置片段
"mysql.host": "localhost",
"mysql.user": "dev_user",
"mysql.password": "",
"mysql.defaultDatabase": "shop",
"mysql.ssl": false
27. 安全审计与合规
27.1 敏感数据发现
sql复制-- 扫描可能包含身份证号的列
SELECT table_schema, table_name, column_name
FROM information_schema.columns
WHERE column_name LIKE '%id_card%'
OR column_name LIKE '%identity%';
27.2 权限审计报告
sql复制-- 生成权限矩阵报表
SELECT
grantee,
GROUP_CONCAT(DISTINCT privilege_type) AS privileges
FROM information_schema.user_privileges
GROUP BY grantee;
28. 备份恢复进阶方案
28.1 时间点恢复(PITR)
bash复制# 恢复全量备份
xtrabackup --copy-back --target-dir=/backups/full
# 应用binlog到指定时间点
mysqlbinlog --start-datetime="2023-05-01 14:30:00" \
--stop-datetime="2023-05-01 15:00:00" \
/var/lib/mysql/mysql-bin.000123 | mysql -uroot -p
28.2 延迟从库配置
sql复制-- 设置从库延迟1小时
CHANGE MASTER TO MASTER_DELAY=3600;
START SLAVE;
29. 查询优化器调优
29.1 索引提示使用
sql复制-- 强制使用特定索引
SELECT * FROM orders USE INDEX(idx_user)
WHERE user_id=100 AND status=1;
-- 忽略性能差的索引
SELECT * FROM products IGNORE INDEX(idx_category)
WHERE category_id=5 AND stock>0;
29.2 优化器开关控制
sql复制-- 禁用特定优化策略
SET optimizer_switch='block_nested_loop=off';
-- 查看当前优化器配置
SELECT @@optimizer_switch\G
30. 全文检索实现方案
30.1 中文全文索引
sql复制-- 创建支持中文的全文索引
CREATE TABLE articles (
id INT PRIMARY KEY,
title VARCHAR(200),
content TEXT,
FULLTEXT (title, content) WITH PARSER ngram
) ENGINE=InnoDB;
-- 使用布尔模式搜索
SELECT * FROM articles
WHERE MATCH(title,content) AGAINST('+MySQL -Oracle' IN BOOLEAN MODE);
30.2 搜索结果优化
sql复制-- 按相关性排序
SELECT
id,
title,
MATCH(title,content) AGAINST('数据库故障排查') AS score
FROM articles
ORDER BY score DESC;
31. GIS地理数据处理
31.1 空间索引应用
sql复制-- 创建包含地理坐标的表
CREATE TABLE stores (
id INT PRIMARY KEY,
name VARCHAR(100),
location POINT NOT NULL SRID 4326,
SPATIAL INDEX(location)
);
-- 查询5公里范围内的门店
SELECT id, name,
ST_Distance_Sphere(location, POINT(116.404, 39.915)) AS distance
FROM stores
WHERE ST_Distance_Sphere(location, POINT(116.404, 39.915)) <= 5000
ORDER BY distance;
31.2 地理围栏判断
sql复制-- 判断坐标是否在电子围栏内
SET @fence = ST_GeomFromText('POLYGON((...))');
SELECT name FROM delivery_areas
WHERE ST_Contains(@fence, ST_PointFromText('POINT(116.404 39.915)'));
32. 分区表管理策略
32.1 按时间范围分区
sql复制-- 创建按月分区的日志表
CREATE TABLE access_logs (
id BIGINT AUTO_INCREMENT,
access_time DATETIME,
user_id INT,
PRIMARY KEY (id, access_time)
) PARTITION BY RANGE (TO_DAYS(access_time)) (
PARTITION p202301 VALUES LESS THAN (TO_DAYS('2023-02-01')),
PARTITION p202302 VALUES LESS THAN (TO_DAYS('2023-03-01')),
PARTITION pmax VALUES LESS THAN MAXVALUE
);
-- 定期添加新分区
ALTER TABLE access_logs REORGANIZE PARTITION pmax INTO (
PARTITION p202303 VALUES LESS THAN (TO_DAYS('2023-04-01')),
PARTITION pmax VALUES LESS THAN MAXVALUE
);
32.2 分区维护操作
sql复制-- 归档旧分区数据
ALTER TABLE access_logs TRUNCATE PARTITION p202201;
-- 重建分区索引
ALTER TABLE access_logs REBUILD PARTITION p202301;
33. 多租户架构实现
33.1 Schema级隔离
sql复制-- 为每个租户创建独立数据库
CREATE DATABASE tenant_acme;
GRANT ALL ON tenant_acme.* TO 'acme_admin'@'%';
-- 跨租户查询(管理员视图)
SELECT * FROM information_schema.tables
WHERE table_schema LIKE 'tenant_%';
33.2 共享表隔离
sql复制-- 使用tenant_id列区分租户
CREATE TABLE orders (
id BIGINT PRIMARY KEY,
tenant_id INT NOT NULL,
INDEX (tenant_id),
FOREIGN KEY (tenant_id) REFERENCES tenants(id)
);
-- 强制租户过滤
CREATE VIEW tenant_orders AS
SELECT * FROM orders WHERE tenant_id = CURRENT_TENANT_ID();
34. 数据脱敏方案
34.1 动态数据掩码
sql复制-- 创建视图实现掩码
CREATE VIEW masked_customers AS
SELECT
id,
CONCAT(LEFT(name,1), '***') AS name,
CONCAT('****', RIGHT(phone,4)) AS phone
FROM customers;
-- 使用函数动态处理
SELECT
id,
mask_inner(name, 1, 3) AS name,
mask_outer(phone, 4, 4, '*') AS phone
FROM customers;
34.2 静态数据脱敏
sql复制-- 更新数据实现永久脱敏
UPDATE users SET
email = CONCAT('user', id, '@example.com'),
phone = CONCAT('138', FLOOR(RAND()*9000)+1000);
35. 版本控制集成
35.1 Schema迁移管理
bash复制# 使用Flyway初始化数据库
flyway -url=jdbc:mysql://localhost:3306/shop \
-user=deploy -password=xxx migrate
# 生成差异脚本
mysqldump --no-data shop > schema.sql
35.2 变更回滚方案
sql复制-- 使用事务实现DDL回滚(MySQL 8.0+)
START TRANSACTION;
ALTER TABLE products ADD COLUMN discount TINYINT;
-- 验证无误后提交
COMMIT;
-- 或回滚
ROLLBACK;
36. 外部数据集成
36.1 联邦查询配置
sql复制-- 创建联邦表链接Oracle
CREATE SERVER oracle_db
FOREIGN DATA WRAPPER mysql
OPTIONS (
HOST 'oracle01',
DATABASE 'orcl',
USER 'link_user',
PASSWORD 'xxx',
PORT 1521
);
CREATE TABLE oracle_products (
id INT,
name VARCHAR(100)
) ENGINE=FEDERATED
CONNECTION='oracle_db/products';
36.2 外部文件加载
sql复制-- 导入CSV数据
LOAD DATA INFILE '/tmp/products.csv'
INTO TABLE products
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;
37. 缓存优化策略
37.1 查询缓存禁用
sql复制-- 确认查询缓存状态
SHOW VARIABLES LIKE 'query_cache%';
-- 彻底禁用(8.0已移除该功能)
SET GLOBAL query_cache_size=0;
37.2 结果集缓存
sql复制-- 使用应用层缓存
SELECT SQL_NO_CACHE * FROM products
WHERE category_id=5;
38. 连接池配置
38.1 服务端连接控制
sql复制-- 查看连接来源分布
SELECT user, host, count(*)
FROM information_schema.processlist
GROUP BY user, host;
-- 设置连接超时
SET GLOBAL wait_timeout=300;
SET GLOBAL interactive_timeout=60;
38.2 客户端连接池
properties复制# HikariCP配置示例
jdbcUrl=jdbc:mysql://localhost:3306/shop
username=app_user
password=xxx
maximumPoolSize=20
connectionTimeout=30000
39. 字符集与排序规则
39.1 多语言支持方案
sql复制-- 创建支持多语言的表
CREATE TABLE translations (
id INT PRIMARY KEY,
content_en TEXT CHARACTER SET utf8mb4,
content_zh TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_zh_0900_as_cs,
content_ja TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_ja_0900_as_cs
);
39.2 排序规则选择
sql复制-- 区分大小写的查询
SELECT * FROM users
WHERE username COLLATE utf8mb4_bin = 'Admin';
-- 中文拼音排序
SELECT * FROM products
ORDER BY name COLLATE utf8mb4_zh_0900_as_cs;
40. 压力测试与基准
40.1 模拟生产负载
bash复制# 使用sysbench进行混合读写测试
sysbench oltp_read_write \
--mysql-host=127.0.0.1 \
--mysql-user=load_user \
--mysql-password=xxx \
--mysql-db=shop \
--tables=10 \
--table-size=1000000 \
--threads=32 \
--time=300 \
--report-interval=10 \
run
40.2 性能基准报告
sql复制-- 查看测试期间性能指标
SELECT * FROM sys.metrics
WHERE variable_name LIKE '%innodb%'
AND type='STATUS';
41. 错误处理与调试
41.1 错误日志分析
sql复制-- 查看最近错误
SELECT * FROM performance_schema.events_errors_summary_global_by_error
WHERE error_number != 0
ORDER BY error_count DESC;
-- 调整日志详细程度
SET GLOBAL log_error_verbosity=3;
41.2 存储过程调试
sql复制-- 输出调试信息
DELIMITER //
CREATE PROCEDURE debug_test()
BEGIN
DECLARE var1 INT DEFAULT 10;
SELECT CONCAT('Debug:', var1) AS debug_info;
END //
DELIMITER ;
42. 复制拓扑管理
42.1 多源复制配置
sql复制-- 从多个主库复制数据
CHANGE MASTER TO MASTER_HOST='master1' FOR CHANNEL 'channel1';
CHANGE MASTER TO MASTER_HOST='master2' FOR CHANNEL 'channel2';
START SLAVE FOR CHANNEL 'channel1';
START SLAVE FOR CHANNEL 'channel2';
42.2 复制过滤规则
sql复制-- 只复制特定数据库
CHANGE REPLICATION FILTER REPLICATE_DO_DB = (shop, inventory);
43. 临时表应用场景
43.1 会话级临时表
sql复制-- 创建事务结束后自动删除的临时表
CREATE TEMPORARY TABLE temp_results (
id INT,
value DECIMAL(10,2)
) ENGINE=Memory;
-- 用于复杂计算中间结果
INSERT INTO temp_results
SELECT product_id, AVG(price)
FROM orders
GROUP BY product_id;
43.2 内存表优化
sql复制-- 创建内存表加速临时计算
CREATE TABLE fast_cache (
key VARCHAR(100) PRIMARY KEY,
value TEXT
) ENGINE=MEMORY;
44. 触发器与事件
44.1 审计触发器示例
sql复制DELIMITER //
CREATE TRIGGER audit_user_changes
AFTER UPDATE ON users
FOR EACH ROW
BEGIN
INSERT INTO user_audit
SET user_id = NEW.id,
changed_field = 'email',
old_value = OLD.email,
new_value = NEW.email,
change_time = NOW();
END //
DELIMITER ;
44.2 定时事件任务
sql复制-- 每天凌晨清理临时数据
CREATE EVENT cleanup_temp_data
ON SCHEDULE EVERY 1 DAY STARTS '2023-01-01 03:00:00'
DO
DELETE FROM temp_sessions WHERE created_at < NOW() - INTERVAL 1 DAY;
45. 视图与物化视图
45.1 安全视图设计
sql复制-- 限制数据访问的视图
CREATE VIEW client_products AS
SELECT id, name, price FROM products
WHERE status = 1 AND stock > 0
WITH CHECK OPTION;
45.2 模拟物化视图
sql复制-- 使用定时事件刷新汇总数据
CREATE TABLE sales_summary (
product_id INT PRIMARY KEY,
total_sales DECIMAL(12,2),
last_updated TIMESTAMP
);
CREATE EVENT refresh_sales_summary
ON SCHEDULE EVERY 1 HOUR
DO
REPLACE INTO sales_summary
SELECT product_id, SUM(amount), NOW()
FROM order_items
GROUP BY product_id;
46. 批处理优化技巧
46.1 大批量插入优化
sql复制-- 使用LOAD DATA替代INSERT
LOAD DATA INFILE '/tmp/bulk_data.csv'
INTO TABLE products
FIELDS TERMINATED BY ',';
-- 批量插入时禁用索引
ALTER TABLE products DISABLE KEYS;
INSERT INTO products VALUES (...), (...), (...);
ALTER TABLE products ENABLE KEYS;
46.2 分批更新策略
sql复制-- 避免大事务锁表
SET @max_id = (SELECT MAX(id) FROM orders);
SET @batch_size = 1000;
SET @start_id = 1;
WHILE @start_id <= @max_id DO
UPDATE orders SET status=2
WHERE id BETWEEN @start_id AND @start_id+@batch_size-1
AND status=1;
SET @start_id = @start_id + @batch_size;
