MySQL數據庫備份和恢復

數據庫備份

  • 數據庫複製不能取代備份的作用
  • 備份分類:
    • 備份內容:
      • 邏輯備份:結果爲SQL語句,適用於所有存儲引擎
      • 物理備份:對數據庫目錄的靠背,對於內存表只備份結構
    • 備份方式:
      • 全量備份:整個數據庫的完整備份
      • 增量備份:在上一次備份基礎上,對更改數據進行備份。mysqldump不支持這種

mysqldump全備介紹

  • mysqldump備份
mysqldump database [tables]
mysqldump --database DB1 [DB2]
mysqldump --all-databases
  • 常用參數
    • -u
      • 賬戶具備的權限SELECT, RELOAD, LOCK TABLES, REPLICATION CLIENT, SHOW VIEW, PROCESS
    • -p
    • --single-transaction 開啓事務來操作,innodb推薦用這個
    • -l 依次鎖表,一般myisam用。備份時鎖住一個數據庫下的表。如果混合引擎的表也用這個參數,和--single-transaction互斥。只能保持一個db下的一致
    • -x,鎖所有db的所有表
    • --master-data=[1或2] 時間恢復和新的slave實例用。1把change master to被記錄,2則是把1放在註釋裏,配合--single-transaction一起指定
    • -R 備份存儲過程
    • --triggers 觸發器
    • -E 備份調度事件
    • --hex-blob 把數據文本變成hex格式
    • --tab=path 指定路徑下,生成表結構和表數據兩個文件
    • -w='過濾條件',單表導出用

mysqldump恢復

  • bash: mysql -u -p dbname < backup.sql
  • mysql client: mysql> source /tmp/backup.sql

指定時間點的恢復

先決條件

  • 具有指定時間點前的一個全備
  • 具備自上次全備後到指定時間點的所有“二進制日誌”(相當於重複操作從備份時間點的到現在的數據庫操作)

步驟:

  • 還原某個時間點的全備mysql -uroot -p mc_orderdb < mc_order_backup.sql
  • 查找全備時開始的mysql-bin的log操作的日誌點(change master那行)
  • 查看最近的誤操作mysql-bin的log的日誌點
  • mysqlbinlog --start-position=84882 --stop-position=169348 --database=mc_orderdb > mc_order_diff.sql
  • mysql -uroot -p mc_orderdb < mc_order_diff.sql

實時備份binlog

  • GRANT REPLICATION SLAVE ON *.* TO 'repl'@'ip' IDENTIFIED BY 'xxxxxx'
  • mkdir -p binlog_backup
  • mysqlbinlog --raw --read-from-remote-server --stop-never --host localhost --port 3306 -u repl -p xxxxxx 二進制日誌名

xtrabackup備份和恢復

  • xtrabackup用於在線備份innodb存儲引擎的表
    • 只會備份數據文件,不會備份表結構
  • innobackupex是對extrabackup的封裝並提供MyISAM表的備份功能
    • innobackupex是Xtrabackup的插件支持MyISAM備份,但也會鎖表
全備和恢復
  • 全備innobackupex --user=root --password=pwd --parallel=2 /home/db_backup/

  • 備份恢復innobackupex --apply-log /path/to/BACKUP-DIR

增量備份和恢復
  • 增量備份innobackupex --user=root --password=pwd --incremental /home/db_backup/ --incremental-basedir=/home/db_backup/back-dir 參數--incremental-basedir上一次全備的文件夾
  • 增量備份恢復
    1. innobackupex --apply-log --redo-only 全備目錄
    2. innobackupex --apply-log --redo-only 全備目錄 --incremental-dir=第一次增量目錄
    3. innobackupex --apply-log 全備目錄
    4. mv /path/to/BACKUP-DIR /home/mysql/data 恢復後的數據直接替換原本的
    5. 記得改變屬於的用戶chmod

制定備份計劃

  • 每天凌晨對數據庫進行一次全備
  • 實時對二進制日誌進行遠程備份
    • 使用linux定時任務:crontab

參考

  1. 高性能可擴展MySQL數據庫設計及架構優化 電商項目,sqlercn,https://coding.imooc.com/class/79.html

關於我:

linxinzhe,全棧工程師,目前供職於某世界500強銀行的金融科技部門(人工智能,區塊鏈)。

GitHub:https://github.com/linxinzhe

歡迎留言討論,也歡迎關注我~
我也會關注你的哦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章