mysql 備份與恢復(全量與增量)
全量備份使用自帶的mysqldump命令
備份命令
mysqldump -u[username] -p[password] [database] [table] > backup.sql
恢復命令
mysql -u[username] -p[password] [database] < backuo.sql
注意恢復命令是mysql不是mysqldump了。
增量備份與恢復
我們開啟日誌功能,在進行備份後,在指定目錄下會產生當次備份後所有操作的日誌,通過這個日誌,可以把全量備份後所進行的操作所改變的資料狀態恢復出來。
1.在 /etc/mysql 下的my.conf 配置檔案中。找到log_bin語句,並取點前面的註釋符號。
#log_bin = /var/log/mysql/mysql-bin.log
2.使用一下命令進行備份
mysqldump -u[username] -p[password] --single-transaction --flush-logs --master-data=2 [database] [table] > backup.sql
single-transaction的作用是在一個事務裡對全部表取得一致性快照來保證事務的一致性。
master-data=2 主要是記錄Binlogde log 和pos,用於之後基於位置和時間點的恢復。
執行了上面這條命令之後,同樣會得到一個backup.sql的備份檔案,另外在目錄/var/log/mysql/下面會有日誌檔案生成。
例如,在我的目錄下生成了名為 “mysql-bin.000005” 的二進位制檔案。
使用命令 mysqlbinlog mysql-bin.000005 > test0005.sql
可以將二進位制檔案解析出來。
部分擷取如下:
#170331 0:56:19 表示時間是2017年03月31日的0點56, end_log_pos 295 表示上一條命令的行序號
-------------------------------------
#170331 0:56:19 server id 1 end_log_pos 295 Xid = 443
COMMIT/*!*/;
# at 295
#170331 0:56:22 server id 1 end_log_pos 364 Query thread_id=39 exec_time=0 error_code=0
SET TIMESTAMP=1490946982/*!*/;
BEGIN
/*!*/;
# at 364
#170331 0:56:22 server id 1 end_log_pos 456 Query thread_id=39 exec_time=0 error_code=0
SET TIMESTAMP=1490946982/*!*/;
insert one value(2233,"qwe")
-----------------------------------------------------------------------------
我們同樣使用命令:
mysqldump -u[username] -p[password] [database] [table] > backup.sql
來恢復全量備份。
然後通過對日誌的檢視,通過使用“時間”或者“行號”作為約束條件,我們可以恢復我們所需要的增量資料。
a.使用時間作為約束條件
mysqlbinlog --start-datetime="20170331 00:56:19" --stop-datetime="20170331 00:57:11" mysql-bin.000005 | mysql -u[username] -p[password]
b.使用行號作為約束條件
mysqlbinlog --start-position=1556 --stop-position=1648 mysql-bin.000005 |mysql -u[username] -p[password]
------
補充一下,如果要在Linux下面執行定時備份,先建立可執行指令碼。
#!/bin.bash
mysqldump -u[username] -p[password] kuone | gzip > /home/andy/testSQL/DatabaseName_$(date +%Y%m%d_%H%M%S).sql
然後使用命令 crontab -e 在裡面寫定時任務,比如每天0點執行一次
0 0 * * * sh /home/andy/backup.sh
然後重啟一下cron任務
service cron restart
好了,就是這樣。