首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

mysqldump 備份與恢復全攻略:從單庫到全例、Python 定時保留 N 份腳本實戰

     編輯:MySQL 綜合教學

基礎命令速查

場景命令
單庫備份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-transactionInnoDB 熱備份,啟動一致性快照,不加表鎖
--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()

部署建議

  1. 腳本放入 /opt/scripts/backup_mysql.py,授權 chmod +x。
  2. crontab -e 添加:0 2 * * * /usr/bin/python /opt/scripts/backup_mysql.py(每天 02:00 執行)。
  3. 備份目錄掛載獨立磁碟/NFS,避免佔滿系統盤。
  4. 定期演練 mysql < backup.sql 恢復驗證,確保備份可用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved