全量備份使用自帶的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?
好了,就是這樣。