1. 程式人生 > 實用技巧 >MySQL備份

MySQL備份

目錄

一、mysql資料備份

#mysql客戶端
mysql
mysqladmin
mysqldump

1.備份的原因

1.備份就是為了恢復。
2.儘量減少資料的丟失(公司的損失)

2.備份的型別

1.冷備:停庫,停服務,備份
2.熱備:不停庫,不停服務,備份
3.溫備:不停服務,鎖表(阻止資料寫入),備份

#冷備份:
這些備份在使用者不能訪問資料時進行,因此無法讀取或修改資料。這些離線備份會阻止執行任何使用資料的活動。這些型別的備份不會干擾正常執行的系統的效能。但是,對於某些應用程式,會無法接受必須在一段較長的時間裡鎖定或完全阻止使用者訪問資料。

#溫備份:
這些備份在讀取資料時進行,但在多數情況下,在進行備份時不能修改資料本身。這種中途備份型別的優點是不必完全鎖定終端使用者。但是,其不足之處在於無法在進行備份時修改資料集,這可能使這種型別的備份不適用於某些應用程式。在備份過程中無法修改資料可能產生效能問題。

#熱備份:
這些動態備份在讀取或修改資料的過程中進行,很少中斷或者不中斷傳輸或處理資料的功能。使用熱備份時,系統仍可供讀取和修改資料的操作訪問。

3.備份的策略

1.全備:全部資料備份
2.增備:針對於上一次備份,將新資料備份
3.差異備份:基於上一次全備進行新資料的備份

4.備份方式

1)邏輯備份

#基於SQL語句的備份
1.binlog
2.into outfile
	[root@db03 data]# vim /etc/my.cnf
	[mysqld]
	secure-file-priv=/tmp
	mysql> select * from world.city into outfile '/tmp/world_city.data';

3.mysqldump
4.replication

2)物理備份

#備份底層的資料檔案
1.備份整個data資料目錄
2.xtrabackup

二、mysqldump客戶端

1.常用引數

1.不加引數:用於備份單個表
    1)備份庫
    [root@db02 ~]# mysqldump ku > /tmp/ku.sql
    2)備份表
    [root@db02 ~]# mysqldump ku test > /tmp/ku.sql
    3)備份多個表
    [root@db02 ~]# mysqldump ku test test2 test3 > /tmp/ku.sql
    #注意:當不加引數時命令後面跟的是庫名,庫的後面全都是必須是庫下面的表名

2.連線服務端引數(基本引數):-u -p -h -P -S

3.-A, --all-databases:全庫備份

4.-B:指定庫備份
[root@db01 ~]# mysqldump -uroot -p123 -B db1 > /backup/db1.sql
[root@db01 ~]# mysqldump -uroot -p123 -B db1 db2 > /backup/db1_db2.sql

5.-F:flush logs在備份時自動重新整理binlog(不怎麼常用)
[root@db01 backup]# mysqldump -uroot -p123 -A -F > /backup/full_2.sql

6.--master-data=2:備份時加入change master語句0沒有1不註釋2註釋
	1)等於2:記錄binlog資訊,並註釋(日常備份)
	2)等於1:記錄binlog資訊,不註釋(擴充套件從庫)
	0)等於0:不記錄binlog資訊
	[root@db01 backup]# mysqldump -uroot -p123 --master-data=2 >/backup/full.sql

7.--single-transaction:快照備份

8.-d:僅表結構
9.-t:僅資料

10.-R, --routines:備份儲存過程和函式資料
11.--triggers:備份觸發器資料
12.gzip:壓縮備份
	#備份成壓縮包
	[root@db01 ~]# mysqldump -uroot -p123 -A | gzip > /backup/full.sql.gz
	#恢復壓縮包中的資料
	[root@db03 ~]# zcat /tmp/full.sql.gz | mysql -uroot -p123

#完整的備份命令:
mysqldump -uroot -p123 -A -R --triggers --master-data=2 –-single-transaction > /tmp/full.sql

2.注意:

1)mysqldump在備份和恢復時都需要MySQL例項啟動為前提
2)一般資料量級100G以內,大約15-30分鐘可以恢復
3)mysqldump是以覆蓋的形式恢復資料的

三、企業案例

1.背景

1.正在執行的網站系統,MySQL資料庫,資料量25G,日業務增量10-15M。
2.備份策略:每天23:00,計劃任務呼叫mysqldump執行全備指令碼
3.故障時間點:上午10點開發人員誤刪除一個核心業務表,如何恢復?

2.思路

1.停庫,避免二次傷害
2.建立新庫
3.倒入前一天的全備
4.通過binlog找到前一天23:00到第二天10點之間的資料
5.匯入找到的新資料
6.恢復業務
	a.直接使用臨時庫頂替原生產庫,前端應用割接到新庫(資料量特別大的時候)
	b.將誤刪除的表單獨匯出,然後匯入到原生產環境(資料量小的時候)

3.模擬案例

1)模擬生產資料

mysql> create database dump;
mysql> use dump
mysql> create table dump(id int);
mysql> insert dump values(1),(2),(3),(4);
mysql> select * from dump;

2)模擬23:00全備

[root@db03 mysql]# mysqldump -uroot -p123 -A -R --triggers --master-data=2 --single-transaction > /tmp/full.sql

3)模擬23:00到10:00的資料操作

mysql> use dump
mysql> insert dump values(1000),(2000),(3000),(4000);

4)模擬刪庫

mysql> drop database dump;
Query OK, 1 row affected (0.00 sec)

4.恢復資料

1)停庫,避免二次傷害

[root@db03 mysql]# systemctl stop mysqld

2)建立新庫

3)匯入前一天的全備

#老庫將資料傳輸到新庫
[root@db03 ~]# scp /tmp/full.sql 172.16.1.52:/tmp/
#新庫匯入全備資料
[root@db02 ~]# mysql < /tmp/full.sql

4)通過binlog找到前一天23:00到第二天10點之間的資料

1.找到binlog的起始位置點
[root@db03 data]# head -22 /tmp/full.sql | tail -1
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=971790;

2.找到結束位置點
[root@db03 data]# mysqlbinlog mysql-bin.000006 > 1.txt
[root@db03 data]# vim 1.txt
過濾 drop database dump,取出命令上面的位置點
# at 972068
......
drop database dump

3.取出位置點之間的資料
[root@db03 data]# mysqlbinlog -d dump --start-position=971790 --stop-position=972068 mysql-bin.000006 > /tmp/new.sql

5)匯入找到的新資料

#老庫將binlog資料傳到新庫
[root@db03 ~]# scp /tmp/new.sql 172.16.1.52:/tmp/

#新庫匯入新的資料
[root@db02 ~]# mysql < /tmp/new.sql

6)確認資料

mysql> use dump

mysql> show tables;
+----------------+
| Tables_in_dump |
+----------------+
| dump           |
+----------------+

mysql> select * from dump;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
| 1000 |
| 2000 |
| 3000 |
| 4000 |
+------+

7)恢復業務

1.直接使用臨時庫頂替原生產庫,前端應用割接到新庫(資料量特別大的時候)
2.將誤刪除的表單獨匯出,然後匯入到原生產環境(資料量小的時候)
	1)新庫匯出指定業務庫
	[root@db02 ~]# mysqldump dump > /tmp/dump.sql
	2)新庫將資料推送回老庫
	[root@db02 ~]# scp /tmp/dump.sql 172.16.1.53:/tmp
	3)將恢復的資料匯入老庫
	mysql> create database dump;
	mysql> use dump;
	mysql> source /tmp/dump.sql