mysql備份與還原

mysql備份與還原
備份:副本,備份的目的是爲了防止數據丟失或者數據庫出現問題時,進行恢復(備份存放在另一個盤)
備份類型:
    熱備份、溫備份和冷備份
        熱備份:讀寫不受影響
        溫備份:僅可以執行讀操作
        冷備份:離線備份,讀寫操作均中止
    物理備份與邏輯備份
        物理備份:複製數據文件
        邏輯備份:將數據導出至文本文件中
    完全備份、增量備份和差異備份
        完全備份:備份全部數據
        增量備份:僅備份上次完全備份或增量備份以後的變化的數據
        差異備份:僅備份上次完全備份以後的變化的數據
還原:
    備份什麼:以Mysql爲例
        數據、配置文件、二進制日誌(用於即時點還原)、事務日誌
    
熱備份:
    MyISAM:溫備份
    InnoDB:xtrabackup,mysqldump
Mysql
    物理備份:速度快
    邏輯備份:速度慢、丟失浮點數精度,方便使用文本處理工具直接對其處理、可移植能力強
備份策略:完全+增量;完全+差異

Mysql備份工具
    mysqldump:邏輯備份工具,MyISAM(溫)、InnoDB(熱)
    mysqlhotcopy:物理備份工具、溫備份
    
文件系統工具
cp:冷備    
lv:邏輯卷的快照功能,幾乎熱備
    mysql>FLUSH TABLES;
    mysql>LOCK TABLES

一、mysqldump工具使用    
mysqldump直接備份與還原    (mysqldump DB_name [tb1] [tb2]可以備份單個數據庫或表)
[root@shitouji ~]# mysqldump -uroot -p students >students.sql    

[root@shitouji ~]# mysqldump -uroot -p --master-data=2 --flush-logs blog wp_options --single-transaction >/boot/wp_options.sql        #備份指定庫某張表

  • 單張表的備份可以使用select * into outfile '存放路徑及名稱' from 表名     #select * into outfile '/root/test.txt' from test;
  • 還原時使用load data infile '存放路徑及名稱' into table 表名    #load data infile '/root/test.txt' into table test;

[root@shitouji ~]# ls
jiaowu.sql  mysql-community-5.7.21-1.el7.src.rpm  rpmbuild  sh  sources  students.sql

[root@shitouji ~]# mysql test < students.sql 

[root@shitouji ~]# mysql -uroot -p 庫名< students.sql 

問:如果備份時,有其它用戶在進行寫時,會帶來什麼問題?
    會帶時間點的不一致
    因此,要進行加鎖,並且進行二進行日誌滾動(滾動日誌,備份時才知道從什麼時候開始時行)
    
--master-data={0|1|2}
    0:不記錄二進制日誌文件及路位置
    1:以CHANGE MASTER TO 的方式記錄位置,可用於恢復後直接啓動從服務
    2:以CHANGE MASTER TO 的方式記錄位置,但默認是註釋的
    
--lock-all-tables:鎖定所有表
--flush-logs:執行日誌flush

如果指定庫中的表類型均爲INNODB,可使用--single-transaction啓動熱備
    
備份多個庫
    --all-databases:備份所有庫
    --databases DB_NAME,DB_NAME,...:備份指定庫
    
    --events
    --routines
    --triggers
    
備份策略:每週完全+每天增量
    完全備份:mysqldump
    增量符合:備份二進制日誌文件(先執行flush logs進行日誌滾動)
[root@shitouji data]# mysqldump -uroot -p --master-data=2 --flush-logs --all-databases --lock-all-tables > /boot/alldata.sql    
Enter password: 
[root@shitouji data]# mysqlbinlog mysql-bin.000001 > /boot/1.sql      #二進制日誌備份

如果庫中所有的表都是Innodb引擎,則可以進行熱備份

show table status;      #查看庫中所有表的信息(包括表的所用引擎)

[root@shitouji ~]# mysqldump -uroot -p --master-data=2 --flush-logs --databases blog --single-transaction >/boot/blog.sql

#使用--single-transaction選項時,不需要再使用 --lock-all-tables來鎖定表,--single-transaction選項會自動進行鎖定,在備份時,保存的文件最好是有時間格式/boot/blog`date +%F%H%M%S`.sql

還原操作

[root@shitouji shitouji]# mysql -uroot -p < blog.sql          #備份庫還原

二、基於LVM快照備份

前提,數據要在邏輯捲上,且邏輯卷所在的卷組必須有足夠的空間使用快照,.數據文件和事物日誌要在同一個捲上。

原理:LVM中snapshot通過“寫時複製”(copy on write) 來實現,即當一個snapshot創建的時候,僅拷貝原始卷裏數據的元數據(meta-data);創建的時候,並不會有數據的物理拷貝,因此snapshot的創建幾乎是實時的,當原始捲上有寫操作執行時,snapshot跟蹤原始卷塊的改變,這個時候原始捲上將要改變的數據在改變之前被拷貝到snapshot預留的空間裏。

操作步驟:

  • 打開會話,施加讀鎖,鎖定所有表
    • mysql>flush tables  with read lock;
    • mysql>flush logs;
  • 通過另一個終端,保存二進制日誌文件及相關位置信息
    • $mysql -uroot -p -e ‘show master status\G;’ > /path/to/master.info
  • 創建快照卷
    • #lvcreate -L 50M -s -p r -n lv_name  /path/to/source_lv
    • -s|--snapshot:指定創建快照
    • [-p|--permission {r|rw}]:設定創建的快照具有被讀或讀寫特性
    • -n:指定快照名字
  • 釋放鎖
    • mysql>unlock tables;
  • 掛載快照卷,備份
    • $mount  /path/to/lv_name  /mnt
    • $cp -a /mysql/*  /backup/full-backup
  • 刪除快照卷
    • umount /mnt
    • lvremove --froce /path/to/lv_name
  • 增量備份二進制日誌
    • $cat  /path/to/master.info;查看當前二進制日誌位置
    • $mysqlbinlog --start-position=107 mysql-bin.000005 >/backup/bak.sql
    • 當一個事務跨越不同的二進制文件時,開啓通過時間備份--start-datetime
    • $mysqlbinlog --start-datetime=’2016-05-06 14:55:34’ mysql-bin.00005 mysql-bin.000006 > /backup/bak-`date +%F-%H-%M-%S`.sql

還原:

  • $cp -a  /backup/fullbak  /mysql 注意mysql目錄下的文件屬主是mysql
  • $/etc/init.d/mysqld restart
  • mysql>set sql_log_bin=0;關閉二進制日誌
  • mysql>source /backup/bak-`date +%F-%H-%M-%S`.sql;還原數據
  • mysql>set sql_log_bin=1;

xtrabackup工具

xtrabackup 常用選項

  • --user =root  #使用什麼用戶
  • --password=     #用戶密碼
  • --port=      #端口號
  • --socket=     #套接字
  • --target-dir=name   #指定備份路徑
      --backup   #與--target-dir
  • --copy-back

注意事項,mysql5.7後xtrabackup工具得使用2.4版本及以上,mariadb10.3版本以上,不支持xtarbackup工具,可以使用mariabackup工具

備份innobackupex --port=3306 --socket=/tmp/mysql.sock --user=root --datadir=/app/mysqldb /home/backup

xtrabackup使用參照https://www.cnblogs.com/imweihao/p/7290026.html

 

 

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