MySQL 数据库运维手册
目录
- MySQL 安装与配置
- 用户与权限管理
- 数据库操作
- 备份与恢复
- 性能优化
- 主从复制
- 监控与诊断
- 安全加固
- 日常维护
1. MySQL 安装与配置
1.1 CentOS/RHEL 安装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm yum localinstall -y mysql80-community-release-el7-3.noarch.rpm
yum install -y mysql-community-server
systemctl start mysqld systemctl enable mysqld
grep 'temporary password' /var/log/mysqld.log
mysql_secure_installation
|
1.2 Ubuntu/Debian 安装
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| wget https://dev.mysql.com/get/mysql-apt-config_0.8.22-1_all.deb dpkg -i mysql-apt-config_0.8.22-1_all.deb apt-get update
apt-get install -y mysql-server
systemctl start mysql systemctl enable mysql
mysql_secure_installation
|
1.3 配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
|
[mysqld]
port = 3306 socket = /var/lib/mysql/mysql.sock datadir = /var/lib/mysql pid-file = /var/run/mysqld/mysqld.pid
character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci
max_connections = 500 max_connect_errors = 10000 wait_timeout = 28800 interactive_timeout = 28800
innodb_buffer_pool_size = 1G innodb_log_file_size = 256M innodb_log_buffer_size = 16M innodb_flush_log_at_trx_commit = 1 innodb_flush_method = O_DIRECT
log_error = /var/log/mysql/error.log slow_query_log = 1 slow_query_log_file = /var/log/mysql/slow.log long_query_time = 2 log_queries_not_using_indexes = 1
log_bin = /var/log/mysql/mysql-bin binlog_format = ROW expire_logs_days = 7 max_binlog_size = 100M
[client] default-character-set = utf8mb4
|
2. 用户与权限管理
2.1 用户管理
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'password123'; CREATE USER 'app_user'@'%' IDENTIFIED BY 'password123';
ALTER USER 'app_user'@'localhost' IDENTIFIED BY 'newpassword'; SET PASSWORD FOR 'app_user'@'localhost' = PASSWORD('newpassword');
DROP USER 'app_user'@'localhost';
SELECT user, host FROM mysql.user; SHOW GRANTS FOR 'app_user'@'localhost';
|
2.2 权限管理
1 2 3 4 5 6 7 8 9 10 11 12 13
| GRANT ALL PRIVILEGES ON database.* TO 'app_user'@'localhost'; GRANT SELECT, INSERT, UPDATE ON database.table TO 'app_user'@'localhost'; GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%' IDENTIFIED BY 'password';
REVOKE DELETE ON database.* FROM 'app_user'@'localhost';
FLUSH PRIVILEGES;
SHOW GRANTS FOR 'app_user'@'localhost';
|
2.3 角色管理(MySQL 8.0+)
1 2 3 4 5 6 7 8 9 10 11 12
| CREATE ROLE 'read_only', 'read_write';
GRANT SELECT ON *.* TO 'read_only'; GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'read_write';
GRANT 'read_write' TO 'app_user'@'localhost';
SET DEFAULT ROLE 'read_write' TO 'app_user'@'localhost';
|
3. 数据库操作
3.1 数据库管理
1 2 3 4 5 6 7 8 9 10 11 12
| CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
SHOW DATABASES; SHOW CREATE DATABASE mydb;
USE mydb;
DROP DATABASE mydb;
|
3.2 表管理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, email VARCHAR(100) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, INDEX idx_email (email) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
SHOW TABLES; DESCRIBE users; SHOW CREATE TABLE users;
ALTER TABLE users ADD COLUMN phone VARCHAR(20); ALTER TABLE users MODIFY COLUMN email VARCHAR(200); ALTER TABLE users ADD INDEX idx_phone (phone);
DROP TABLE users; TRUNCATE TABLE users;
|
3.3 数据操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| INSERT INTO users (username, email) VALUES ('john', 'john@example.com'); INSERT INTO users (username, email) VALUES ('jane', 'jane@example.com'), ('bob', 'bob@example.com');
SELECT * FROM users; SELECT id, username FROM users WHERE id > 10; SELECT COUNT(*) FROM users;
UPDATE users SET email = 'new@example.com' WHERE id = 1;
DELETE FROM users WHERE id = 1;
|
4. 备份与恢复
4.1 mysqldump 备份
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| mysqldump -u root -p mydb > mydb_backup.sql
mysqldump -u root -p --all-databases > all_databases.sql
mysqldump -u root -p mydb users orders > tables_backup.sql
mysqldump -u root -p mydb | gzip > mydb_backup.sql.gz
mysqldump -u root -p mydb > mydb_$(date +%Y%m%d_%H%M%S).sql
mysqldump -u root -p --no-data mydb > mydb_structure.sql
mysqldump -u root -p --no-create-info mydb > mydb_data.sql
|
4.2 恢复备份
1 2 3 4 5 6 7 8
| mysql -u root -p mydb < mydb_backup.sql
gunzip < mydb_backup.sql.gz | mysql -u root -p mydb
mysql -u root -p < all_databases.sql
|
4.3 物理备份
1 2 3 4 5 6 7 8
| systemctl stop mysqld
cp -r /var/lib/mysql /backup/mysql_backup_$(date +%Y%m%d)
systemctl start mysqld
|
4.4 增量备份
1 2 3 4 5 6 7 8 9 10 11 12 13
|
log_bin = /var/log/mysql/mysql-bin binlog_format = ROW
mysql -u root -p -e "FLUSH LOGS;"
SHOW BINARY LOGS;
mysqlbinlog mysql-bin.000001 | mysql -u root -p
|
5. 性能优化
5.1 索引优化
1 2 3 4 5 6 7 8 9 10 11 12 13
| EXPLAIN SELECT * FROM users WHERE email = 'test@example.com'; EXPLAIN FORMAT=JSON SELECT * FROM users WHERE email = 'test@example.com';
CREATE INDEX idx_email ON users(email); CREATE INDEX idx_name_age ON users(name, age);
SHOW INDEX FROM users;
DROP INDEX idx_email ON users;
|
5.2 查询优化
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| SELECT id, username, email FROM users;
SELECT * FROM users LIMIT 100;
SELECT * FROM users WHERE DATE(created_at) = '2024-01-01';
SELECT * FROM users WHERE created_at >= '2024-01-01' AND created_at < '2024-01-02';
SELECT u.*, o.* FROM users u JOIN orders o ON u.id = o.user_id;
|
5.3 配置优化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
innodb_buffer_pool_size = 4G innodb_buffer_pool_instances = 8
innodb_log_file_size = 512M innodb_log_buffer_size = 32M
max_connections = 1000 thread_cache_size = 50
table_open_cache = 4000 table_definition_cache = 2000
sort_buffer_size = 4M read_buffer_size = 2M read_rnd_buffer_size = 4M tmp_table_size = 256M max_heap_table_size = 256M
|
5.4 慢查询分析
1 2 3 4 5 6 7 8 9
| SHOW VARIABLES LIKE 'slow_query_log%'; SHOW VARIABLES LIKE 'long_query_time';
SELECT * FROM mysql.slow_log;
pt-query-digest /var/log/mysql/slow.log > slow_query_analysis.txt
|
6. 主从复制
6.1 配置主服务器
1 2 3 4 5 6
| [mysqld] server-id = 1 log_bin = /var/log/mysql/mysql-bin binlog_format = ROW binlog_do_db = mydb
|
1 2 3 4 5 6 7
| CREATE USER 'repl'@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
SHOW MASTER STATUS;
|
6.2 配置从服务器
1 2 3 4 5
| [mysqld] server-id = 2 relay_log = /var/log/mysql/mysql-relay-bin read_only = 1
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| CHANGE MASTER TO MASTER_HOST='master_ip', MASTER_USER='repl', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154;
START SLAVE;
SHOW SLAVE STATUS\G
|
6.3 主从切换
1 2 3 4 5 6 7 8 9 10 11 12 13
| FLUSH TABLES WITH READ LOCK;
SHOW SLAVE STATUS\G
STOP SLAVE; RESET SLAVE ALL;
|
7. 监控与诊断
7.1 状态监控
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| SHOW STATUS; SHOW GLOBAL STATUS;
SHOW VARIABLES; SHOW GLOBAL VARIABLES;
SHOW PROCESSLIST; SHOW FULL PROCESSLIST;
SHOW ENGINE INNODB STATUS\G
|
7.2 性能监控
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| SHOW STATUS LIKE 'Threads_connected'; SHOW STATUS LIKE 'Max_used_connections';
SHOW STATUS LIKE 'Qcache_hits'; SHOW STATUS LIKE 'Qcache_inserts';
SHOW STATUS LIKE 'Table_locks_waited'; SHOW STATUS LIKE 'Table_locks_immediate';
SHOW STATUS LIKE 'Innodb_row_lock%';
|
7.3 监控工具
1 2 3 4 5 6 7 8 9
|
pmmd-server start
mysqld_exporter --config.my-cnf=/etc/mysql/debian.cnf
|
8. 安全加固
8.1 基础安全
1 2 3 4 5 6 7 8 9 10 11 12
| DELETE FROM mysql.user WHERE User='';
DROP DATABASE IF EXISTS test;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'strong_password';
UPDATE mysql.user SET Host='localhost' WHERE User='root'; FLUSH PRIVILEGES;
|
8.2 网络安全
1 2 3 4 5 6 7 8 9 10
| [mysqld]
bind-address = 127.0.0.1
local_infile = 0
symbolic-links = 0
|
1 2 3 4 5 6
| firewall-cmd --add-port=3306/tcp --permanent firewall-cmd --reload
iptables -A INPUT -p tcp --dport 3306 -s 192.168.1.0/24 -j ACCEPT
|
8.3 审计日志
1 2 3 4 5
| [mysqld] plugin_load_add=audit_log audit_log_policy=ALL audit_log_format=JSON
|
9. 日常维护
9.1 定期任务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #!/bin/bash
mysqldump -u root -p'password' --all-databases | gzip > /backup/all_$(date +%Y%m%d).sql.gz
find /backup -name "*.sql.gz" -mtime +7 -delete
mysql -u root -p'password' -e "OPTIMIZE TABLE mydb.users; OPTIMIZE TABLE mydb.orders;"
mysql -u root -p'password' -e "PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);"
mysqlcheck -u root -p'password' --analyze --all-databases
|
9.2 表维护
1 2 3 4 5 6 7 8 9 10 11
| OPTIMIZE TABLE users;
ANALYZE TABLE users;
CHECK TABLE users;
REPAIR TABLE users;
|
9.3 日志轮转
1 2 3 4 5 6 7 8 9 10 11 12 13
| /var/log/mysql/*.log { daily rotate 7 compress delaycompress missingok notifempty create 640 mysql adm postrotate mysqladmin flush-logs endscript }
|
文档版本: 1.0
最后更新: 2026-02-27
适用版本: MySQL 8.0+