MariaDB數據庫的備份與恢復
阿新 • • 發佈:2019-05-10
導致 one 直接 恢復 info quick 邏輯 應該 none MariaDB數據庫的備份與恢復
前提條件:
開啟二進制日誌:二進制日誌可用於數據庫恢復時使用,建議二進制日誌與數據庫數據分開存放。
開啟二進制日誌的方法:
[ [email protected]~]# vim /etc/my.cnf [mysqld] log_bin=/data/binary-log/mariadb-bin
註:日誌會存放在/data/binary-log目錄下,文件名為mariadb-bin.000001下
mysqldump
邏輯備份工具,適用所有存儲引擎,溫備;支持完全或部分備份;對InnoDB存儲引擎支持熱備,結合binlog的增量備份
mysqldump工具:客戶端命令,通過mysql協議連接至mysql服務器進行備份
-
用法1:
mysqldump [OPTIONS] database [tables]:默認只將查詢結果打印到屏幕
- 備份
mysqldump -uroot -ppasswd database > database.sql - 還原
mysql database [table] < database.sql - 註:還原的時候,直接重定向執行,但是前提是database數據庫存在,如果不存在擇不能還原
- 備份
- 用法2:
mysqldump [OPTIONS] –B DB1 [DB2 DB3...] (會備份數據庫的定義)
- 備份:
mysqldump -B database > database.sql - 還原:
mysql [table] < database.sql
- 備份:
- 用法3:
mysqldump [OPTIONS] –A [OPTIONS](備份所有數據庫不包括performance_schema和information_schema庫)
- 備份
mysqldump -A > alltabase.sql - 還原:
mysql> set sql_log_bin=OFF; 臨時關閉二進制日誌
mysql> reset master; 清除所有二進制日誌
mysql> source ~/alltabase.sql
mysql> set sql_log_bin=ON; 開啟二進制日誌
- 備份
mysqldump常見選項:
- -A, --all-databases 備份所有數據庫,含create database
- -B , --databases db_name… 指定備份的數據庫,包括create database語句
- -E, --events:備份相關的所有event scheduler 計劃任務
- -R, --routines:備份所有存儲過程和自定義函數
- --triggers:備份表相關觸發器,默認啟用,用--skip-triggers,不備份觸發器
- --default-character-set=utf8 指定字符集
- --master-data[=#]: 此選項須啟用二進制日誌
1:所備份的數據之前加一條記錄為CHANGE MASTER TO語句,非註釋,不指定#,默認為1
2:記錄為註釋的CHANGE MASTER TO語句此選項會自動關閉--lock-tables功能,自動打開-x | --lock-all-tables功能(除非開啟--single-transaction) - -F, --flush-logs :備份前滾動日誌,鎖定表完成後,執行flush logs命令,生成新的二進制日誌文件,配合-A 或 -B 選項時,會導致刷新多次數據庫。建議在同一時刻執行轉儲和日誌刷新,可通過和--single-transaction或-x,--master-data 一起使用實現,此時只刷新一次日誌
- --compact 去掉註釋,適合調試,生產不使用
- -d, --no-data 只備份表結構
- -t, --no-create-info 只備份數據,不備份create table
- -n,--no-create-db 不備份create database,可被-A或-B覆蓋
- --flush-privileges 刷新權限,備份mysql或相關時需要使用
- -f, --force 忽略SQL錯誤,繼續執行
- --hex-blob 使用十六進制符號轉儲二進制列,當有包括BINARY,VARBINARY,BLOB,BIT的數據類型的列時使用,避免亂碼
- -q, --quick 不緩存查詢,直接輸出,加快備份速度
通過備份文件和二進制文件恢復數據庫到當前裝填
通常數據庫的備份都發生在淩晨用戶訪問量較少的時候進行,例如我們在淩晨3點對數據庫進行了完全備份,但是在上午11點的時候,因為管理員的誤操作,到時候數據庫某張表被刪除,如果我們用數據庫的完整備份的話,就只能恢復到淩晨3點,那麽要恢復3點到11點這段時間的數據,就需要用到二進制日誌
前提:在進行數據庫備份的時候加了--master-data=[1|2]選項,記錄了數據庫備份時,日誌的位置
具體步驟
- 對數據庫進行完整備份
[ [email protected]~]# mysqldump -A --master-data=2 > database.sql [ [email protected]~]# less database.sql -- CHANGE MASTER TO MASTER_LOG_FILE=‘mariadb-bin.000007‘, MASTER_LOG_POS=8134; 這條記錄了當前的備份所在的日誌位置,為mariadb-bin.000007的8134
- 對數據庫的數據進行修改
MariaDB [hellodb]> select * from teachers; +-----+---------------+-----+--------+ | TID | Name | Age | Gender | +-----+---------------+-----+--------+ | 1 | Song Jiang | 45 | M | | 2 | Zhang Sanfeng | 94 | M | | 3 | Miejue Shitai | 77 | F | | 4 | Lin Chaoying | 93 | F | | 5 | weiying | 25 | NULL | +-----+---------------+-----+--------+ MariaDB [hellodb]> insert teachers(name,age) value("xiao ming",20); MariaDB [hellodb]> select * from teachers; +-----+---------------+-----+--------+ | TID | Name | Age | Gender | +-----+---------------+-----+--------+ | 1 | Song Jiang | 45 | M | | 2 | Zhang Sanfeng | 94 | M | | 3 | Miejue Shitai | 77 | F | | 4 | Lin Chaoying | 93 | F | | 5 | weiying | 25 | NULL | | 6 | xiao ming | 20 | NULL | +-----+---------------+-----+--------+
- 查看當前二進制日誌記錄的位置
MariaDB [hellodb]> show master logs; +--------------------+-----------+ | Log_name | File_size | +--------------------+-----------+ | mariadb-bin.000001 | 15763 | | mariadb-bin.000002 | 30376 | | mariadb-bin.000003 | 1038814 | | mariadb-bin.000004 | 8153 | | mariadb-bin.000005 | 30376 | | mariadb-bin.000006 | 1038814 | | mariadb-bin.000007 | 8373 | +--------------------+-----------+ 之前數據庫備份時二進制的位置為8134
- 刪除數據庫並恢復
- 停止服務並刪除數據庫:
[ [email protected]~]# systemctl stop mariadb [ [email protected]~]# rm -rf /var/lib/mysql/* [ [email protected]~]# systemctl start mariadb
- 恢復:
- 先獲取備份之後二進制日誌文件的內容:
[ [email protected]~]# mysqlbinlog --start-position=8134 /data/binary-log/mariadb-bin.000007 > binary.sql
導入備份和二進制日誌恢復:
MariaDB [(none)] set sql_log_bin=OFF; 臨時關閉二進制日誌 MariaDB [(none)] reset master; 清除所有二進制日誌 MariaDB [(none)] source database.sql MariaDB [(none)] source binary.sql MariaDB [(none)] mysql> set sql_log_bin=ON; 開啟二進制日誌
- 查詢數據表:數據庫恢復到最新狀態
- 註:如果在備份完成之後,是因為刪除了某張表導致的數據庫崩潰,那麽在提取出來的二進制文件中找到該條drop語句,並將其註釋。
- 停止服務並刪除數據庫:
MariaDB數據庫的備份與恢復