基礎命令速查
| 場景 | 命令 |
| 單庫備份 | mysqldump db_name > bak.sql |
| 指定用戶/密碼 | mysqldump -u root -p'pwd' db_name > bak.sql |
| 多庫備份 | mysqldump --databases db1 db2 db3 > dump.sql |
| 全例備份 | mysqldump --all-databases > full.sql |
| 單表備份 | mysqldump db_name tbl_name > tbl.sql |
| 恢復 | mysql db_name < bak.sql 或 SOURCE bak.sql |
備份文件結構解析
生成的 .sql 包含:
- 版本/字符集/時區/檢查開關 設置語句(
/*!40101 SET ... */ 版本條件註釋)。
DROP TABLE IF EXISTS + CREATE TABLE(結構)。
LOCK TABLES ... WRITE; ALTER TABLE ... DISABLE KEYS; INSERT ...; ALTER TABLE ... ENABLE KEYS; UNLOCK TABLES;(數據)。
- 還原會話變量。
進階常用參數
| 參數 | 作用 |
--single-transaction | InnoDB 熱備份,啟動一致性快照,不加表鎖 |
--master-data=2 | 輸出 CHANGE MASTER TO 註釋,記錄 binlog 位點,便於從庫搭建 |
--routines --triggers --events | 備份存儲過程/觸發器/事件(默認已含) |
--no-data | 僅備份結構 |
--where / -w | 按條件導出子集(見本專欄「mysqldump -w 實戰」) |
--hex-blob | 二進制列用十六進制導出,避免字符集問題 |
--quick | 大表流式讀取,不緩存全表到內存 |
Python 定時備份保留最近 N 份腳本
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os, sys, time, logging, traceback
logging.basicConfig(
format='%(asctime)s %(levelname)s %(module)s.%(funcName)s Line:%(lineno)d\t%(message)s',
filename=os.path.join(os.path.dirname(__file__), 'backStrategyData.log'),
filemode='a+', level=logging.NOTSET
)
log = logging.getLogger()
MYSQL_IP = ''
BAK_PATH = r'/data/backup/strategydata'
DB_NAME = 'strategydata'
USER = ''
PWD = ''
KEEP_COUNT = 5
SUFFIX = 'strategydata.sql'
class BackupDB:
def __init__(self, host, db, bak_file, user, pwd):
self.host, self.db, self.bak_file, self.user, self.pwd = host, db, bak_file, user, pwd
def _cmd(self):
return "mysqldump --host %s --user=%s --password=%s %s > %s" % \
(self.host, self.user, self.pwd, self.db, self.bak_file)
def run(self):
try:
os.system(self._cmd())
except Exception:
log.error(traceback.format_exc())
def cleanup_old():
files = [f for f in os.listdir(BAK_PATH)
if os.path.isfile(os.path.join(BAK_PATH, f)) and f.endswith(SUFFIX)]
files.sort(reverse=True)
for f in files[KEEP_COUNT-1:]:
try:
os.remove(os.path.join(BAK_PATH, f))
log.info('delete file %s', f)
except Exception:
log.error(traceback.format_exc())
def main():
try:
cleanup_old()
bak_file = os.path.join(BAK_PATH, time.strftime("%Y-%m-%d-%H-%M-%S") + SUFFIX)
log.info('backup %s:%s to %s', MYSQL_IP, DB_NAME, bak_file)
BackupDB(MYSQL_IP, DB_NAME, bak_file, USER, PWD).run()
except Exception:
log.error(traceback.format_exc())
if __name__ == '__main__':
main()
部署建議
- 腳本放入
/opt/scripts/backup_mysql.py,授權 chmod +x。
crontab -e 添加:0 2 * * * /usr/bin/python /opt/scripts/backup_mysql.py(每天 02:00 執行)。
- 備份目錄掛載獨立磁碟/NFS,避免佔滿系統盤。
- 定期演練
mysql < backup.sql 恢復驗證,確保備份可用。