MySQL 是 Linux 下最流行的關係型數據庫。本文匯總從服務管理、帳號權限、庫表操作、數據導入導出、字符集設置到性能優化的高頻命令,作為開發運維的桌面速查手冊。
| 操作 | Systemd (現代) | SysVinit (傳統) |
|---|---|---|
| 啟動 | systemctl start mysqld | service mysqld start / /etc/init.d/mysqld start |
| 停止 | systemctl stop mysqld | service mysqld stop |
| 重啟 | systemctl restart mysqld | service mysqld restart |
| 狀態 | systemctl status mysqld | service mysqld status |
| 開機自啟 | systemctl enable mysqld | chkconfig mysqld on |
服務名可能為 mysql、mysqld、mariadb,視發行版而定。
mysql -u root -p
# 輸入密碼(首次安裝 root 可能為空,直接回車)
mysql -h 192.168.1.100 -u root -p'password' -P 3306
exit
# 或
quit
# 或 Ctrl+D
# 方法一:mysqladmin
mysqladmin -u root -p'oldpass' password 'newpass'
# 方法二:SQL 語句 (需先登錄)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpass';
FLUSH PRIVILEGES;
systemctl stop mysqld
mysqld_safe --skip-grant-tables --skip-networking &
mysql -u root
# 在 mysql> 提示符下
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpass';
exit
# 重啟正常服務
systemctl restart mysqld
CREATE USER 'appuser'@'%' IDENTIFIED BY 'strongpass';
-- 全庫全表讀寫
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'appuser'@'%';
-- 全權限(慎用)
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION;
-- 僅特定表
GRANT SELECT ON mydb.orders TO 'readonly'@'%';
SHOW GRANTS FOR 'appuser'@'%';
REVOKE INSERT ON mydb.* FROM 'appuser'@'%';
DROP USER 'appuser'@'%';
FLUSH PRIVILEGES;
| 操作 | SQL |
|---|---|
| 顯示所有庫 | SHOW DATABASES; |
| 創建庫 | CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; |
| 切換庫 | USE mydb; |
| 刪除庫 | DROP DATABASE mydb; |
| 顯示表 | SHOW TABLES; |
| 查看表結構 | DESC tbl_name; / SHOW CREATE TABLE tbl_name; |
| 創建表 | CREATE TABLE t (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; |
| 刪除表 | DROP TABLE t; |
| 清空表數據 | TRUNCATE TABLE t; (比 DELETE 快,不可回滾) |
# 備份單庫
mysqldump -u root -p --single-transaction --routines --triggers --events mydb > mydb_$(date +%F).sql
# 備份多庫
mysqldump -u root -p --databases db1 db2 > multi.sql
# 備份所有庫
mysqldump -u root -p --all-databases > all.sql
# 只導出結構
mysqldump -u root -p --no-data mydb > schema.sql
# 壓縮備份
mysqldump -u root -p mydb | gzip > mydb_$(date +%F).sql.gz
# 方法一:shell 重定向
mysql -u root -p mydb < mydb.sql
# 方法二:mysql 客戶端內部
mysql -u root -p
mysql> USE mydb;
mysql> SOURCE /path/to/mydb.sql;
# 數據文件:字段用 TAB 分隔,NULL 用 \N 表示
LOAD DATA LOCAL INFILE '/path/data.txt' INTO TABLE tbl_name
FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n';
# Percona XtraBackup (熱備份 InnoDB,不阻塞)
xtrabackup --backup --target-dir=/backup/full --user=root --password
# 增量備份
xtrabackup --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/full
| 層級 | 查看 | 修改 |
|---|---|---|
| 服務器級 | SHOW VARIABLES LIKE 'character_set%'; | 啟動參數 --character-set-server=utf8mb4 或 my.cnf [mysqld] character-set-server=utf8mb4 |
| 庫級 | SHOW CREATE DATABASE mydb; | ALTER DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; |
| 表級 | SHOW CREATE TABLE t; | ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; |
| 連接級 | SHOW VARIABLES LIKE 'character_set_connection'; | 客戶端連接字符串 ?characterEncoding=utf8mb4 或 SET NAMES utf8mb4; |
強烈建議:全鏈路使用 utf8mb4(支持 Emoji、完整 Unicode),避免 utf8(實為 utf8mb3)截斷 4 字節字符。
SHOW FULL PROCESSLIST; / SHOW PROCESSLIST;KILL 12345; (ID 來自 PROCESSLIST)SHOW ENGINE INNODB STATUS\GSELECT table_schema, table_name,
ROUND(data_length/1024/1024,2) AS data_mb,
ROUND(index_length/1024/1024,2) AS idx_mb
FROM information_schema.tables
WHERE table_schema='mydb'
ORDER BY data_mb DESC;
ANALYZE TABLE t;OPTIMIZE TABLE t; (InnoDB 實際執行 ALTER TABLE ... ENGINE=InnoDB 重建)mysqldumpslow -s t /var/log/mysql/slow.log | head -20CHECK TABLE t; / REPAIR TABLE t; (僅 MyISAM)[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_general_ci
# InnoDB 核心
innodb_buffer_pool_size=4G # 物理內存 60-80%
innodb_log_file_size=512M
innodb_log_buffer_size=64M
innodb_flush_log_at_trx_commit=1 # ACID,2 可提升寫性能
innodb_file_per_table=1
innodb_io_capacity=2000 # SSD 建議 2000-5000
# 連接
max_connections=1000
max_connect_errors=100000
# 日志
slow_query_log=1
slow_query_log_file=/var/log/mysql/slow.log
long_query_time=1
log_queries_not_using_indexes=1
# 安全
skip-name-resolve
sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
systemctl status mysqld、netstat -ltnp | grep 3306、防火牆、bind-address、skip-networking。Access denied?確認用戶@主機、密碼、FLUSH PRIVILEGES、密碼插件 (caching_sha2_password vs mysql_native_password)。innodb_flush_log_at_trx_commit、innodb_io_capacity、磁盤 IOPS、sync_binlog。SHOW SLAVE STATUS\G 看 Seconds_Behind_Master、Slave_IO_Running/Slave_SQL_Running、relay_log_space_limit。PURGE BINARY LOGS BEFORE '2024-01-01';、調整 expire_logs_days、清理臨時表、innodb_file_per_table + OPTIMIZE TABLE 回收空間。MySQL 命令繁多,但核心高頻集中在服務管理、權限控制、庫表 DDL、備份恢復、字符集、慢查詢分析六大塊。將本文作為速查表,配合 mysql --help、mysqldump --help、官方文檔,即可覆蓋 95% 日常運維場景。