1. 程式人生 > >超詳細MySql備份策略

超詳細MySql備份策略

wan varchar 時間 只需要 esc dmi select 重復 not null

數據備份的重要性

在生產環境中,數據的安全性是至關重要的,任何數據的丟失都可能產生嚴重的後果。重要性可以體現為以下幾點:
1.提高系統的高可用性和災難可恢復性,在數據庫崩潰時,沒有數據庫備份就沒法找到數據
2.使用數據備份還原數據庫,是數據庫崩潰時提供數據恢復最小代價的最優方案,重新添加數據,代價太大
3.沒有數據就沒有一切,數據庫備份是一種防災難的強力手段

造成數據丟失的原因

程序錯誤
人為錯誤
計算機失敗
磁盤失敗
災難(如火災、地震)和偷竊

數據備份的分類

1、從物理與邏輯的角度,備份可分為物理備份和邏輯備份

邏輯備份:對數據庫邏輯組件(如表等數據庫對象)的備份。註意備份之前要鎖表

物理備份:對數據庫操作系統的物理文件(如數據文件、日誌文件等)的備份

物理備份又可以分為脫機備份(冷備份)和聯機備份(熱備份)
冷備份:是在關閉數據庫的時候進行的(打壓縮包)
熱備份:數據庫處於運行狀態,這種備份方法依賴於數據庫的日誌文件。運行狀態下,大多數操作都會記錄在日誌中,通過日誌回放的方式恢復,只需要備份日誌

2、從數據庫的備份策略角度,備份可分為完全備份、差異備份和增量備份

完全備份:每次對數據進行完整的備份
差異備份:備份那些自從上次完全備份之後被修改過的文件。註意這裏只針對上次完全備份,中間不管會不會再次出現備份
增量備份:只有那些在上次完全備份或者增量備份後修改的文件才會被備份。註意這裏是基於上一次備份,上一次備份方式不管是什麽,將多出來的進行備份

實驗環境

  • 系統環境:CentOS7.4
  • 服務器IP地址:192.168.100.71
  • yum掛載目錄:/mnt/sr0
  • 相關源碼信息:mysql-5.7.17

命令步驟

一、使用tar命令打包文件夾備份

1、安裝xz軟件包

[root@redhat7_1 ~]# yum -y install xz #使用xz壓縮格式,壓縮率較大

2、備份數據目錄

[root@redhat7_1 ~]# tar Jcvf /opt/mysql-$(date +%F).tar.xz /usr/local/mysql/data/ #將mysql數據目錄進行備份,至/opt/目錄下,以當前時間作為後綴,防止文件名重復

3、查看備份數據

[root@redhat7_1 ~]# ls /opt/

技術分享圖片

4、查看備份前後數據大小

技術分享圖片

5、恢復備份數據

[root@redhat7_1 ~]# tar Jxvf /opt/mysql-2018-08-30.tar.xz /usr/local/mysql/data/

6、引入周期性計劃任務

[root@redhat7_1 ~]# crontab -e #編輯周期性計劃任務

技術分享圖片

[root@redhat7_1 ~]# crontab -l
技術分享圖片

二、使用mysqldump工具備份

1、創建測試數據

mysql> create database school default character set utf8 collate utf8_general_ci; #創建數據庫
mysql> use school; #進入school數據庫
#創建"student"表並添加數據
mysql> create table student(Sid int not null primary key auto_increment,Sname char(10),Saddress varchar(50),Sscore decimal(5,2));
mysql> insert into student(Sname,Saddress,Sscore) values(‘huamanlou‘,‘nanjing‘,99); #添加數據
mysql> insert into student(Sname,Saddress,Sscore) values(‘zhanzhao‘,‘kaifeng‘,95);
mysql> insert into student(Sname,Saddress,Sscore) values(‘xiaoqi‘,‘shanghai‘,91);
#創建"teache"表並添加數據
mysql> create table teacher(Tid int not null primary key auto_increment,Tname varchar(20));
mysql> insert into teacher(Tname) values(‘Mr Zhang‘);
mysql> insert into teacher(Tname) values(‘Mr Wang‘);
mysql> insert into teacher(Tname) values(‘Mrs Liu‘);

2、mysqldump命令對單個庫進行完全備份

[root@redhat7_1 ~]# mysqldump -uroot -p school > /opt/school.sql #對"school"庫進行備份
[root@redhat7_1 ~]# vim /opt/school.sql #查看備份sql文件
技術分享圖片

3、mysqldump命令對多個庫進行完全備份

[root@redhat7_1 ~]# mysqldump -u root -p --databases mysql school > /opt/mysql-school-mysql.sql
[root@redhat7_1 ~]# vim /opt/mysql-school-mysql.sql #查看備份sql文件
技術分享圖片

4、對所有庫進行完全備份

[root@redhat7_1 ~]# mysqldump -u root -p --opt --all-databases > /opt/all-data.sql
[root@redhat7_1 ~]# vim /opt/all-data.sql
技術分享圖片

5、指定表或表結構

[root@redhat7_1 ~]# mysqldump -u root -p school student > /opt/school_student.sql
[root@redhat7_1 ~]# vim /opt/school_student.sql
技術分享圖片

[root@redhat7_1 ~]# mysqldump -u root -p -d school student > /opt/school_stu.sql
[root@redhat7_1 ~]# vim /opt/school_stu.sql
技術分享圖片

三、恢復數據庫操作

1、使用source恢復數據庫的操作

[root@redhat7_1 ~]# mysqldump -u root -p --databases school > /opt/mysql_schooldb.sql #備份數據
[root@redhat7_1 ~]# mysql -u root -p
mysql> drop database school;
mysql> show databases;
技術分享圖片

mysql> source /opt/mysql_school.sql #導入school;
mysql> select from school.student;
mysql> select
from school.teacher;
技術分享圖片

2、使用mysql命令恢復數據

[root@redhat7_1 ~]# mysqldump -u root -p school student > /opt/school_student.sql #備份"student"表數據
[root@redhat7_1 ~]# mysql -u root -p
mysql> drop table school.student;
mysql> desc school.student;
mysql> quit
技術分享圖片

[root@redhat7_1 ~]# mysql -u root -p school < /opt/school_student.sql #重新導入數據
[root@redhat7_1 ~]# mysql -u root -p
mysql> select * from school.student;
技術分享圖片

四、數據庫增量備份恢復

1、開啟Mysql二進制日誌功能

[root@redhat7_1 ~]# vim /etc/my.cnf

在mysld標簽下添加:

[mysqld]
log_bin=mysql-bin

[root@redhat7_1 ~]# systemctl restart mysqld.service #重啟服務

[root@redhat7_1 ~]# cd /usr/local/mysql/data/
[root@redhat7_1 data]# ls
技術分享圖片

2、創建相應測試數據

[root@redhat7_1 ~]# mysql -u root -p
mysql> drop database school; #刪除之前的"school"庫
mysql> create database school;
mysql> use school;
mysql> create table student(id int not null primary key auto_increment , name varchar(10),score decimal(5,2));
mysql> insert into student (name,score) values(‘Tom‘,99); #添加以下兩條數據
mysql> insert into student (name,score) values(‘Bob‘,95);
mysql> quit

3、對"school"庫進行完整備份

[root@redhat7_1 ~]# mysqldump -uroot -p --databases school > /opt/school.sql

4、查看二進制日誌

[root@redhat7_1 ~]# mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql-bin.000001
技術分享圖片

5、截斷日誌

[root@redhat7_1 ~]# mysqladmin -uroot -p flush-logs
[root@redhat7_1 ~]# ls /usr/local/mysql/data/
技術分享圖片

[root@redhat7_1 ~]# mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql-bin.000002
技術分享圖片

6、插入測試數據

[root@redhat7_1 ~]# mysql -uroot -p
mysql> insert into school.student(name,score) values(‘t01‘,88);
mysql> insert into school.student(name,score) values(‘t02‘,89);
mysql> quit

7、查看二進制日誌

[root@redhat7_1 ~]# mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql-bin.000002
技術分享圖片

8、再次截斷日誌

[root@redhat7_1 ~]# mysqladmin -uroot -p flush-logs
[root@redhat7_1 ~]# ls /usr/local/mysql/data/
技術分享圖片

9、模擬故障還原數據

[root@redhat7_1 ~]# mysql -uroot -p
mysql> drop database school; #刪除數據庫
mysql> quit

[root@redhat7_1 ~]# mysql -u root -p </opt/school.sql #導入數據
mysql> select * from school.student;
技術分享圖片

[root@redhat7_1 ~]# cd /usr/local/mysql/data/
[root@redhat7_1 data]# mysqlbinlog --no-defaults mysql-bin.000002 | mysql -u root -p #導入增量數據
[root@redhat7_1 ~]# mysql -u root -p
mysql> select * from school.student;
技術分享圖片

五、基於時間點恢復數據

1、重新導入"school"庫完全備份

[root@redhat7_1 ~]# mysql -u root -p </opt/school.sql
[root@redhat7_1 ~]# mysql -u root -p
技術分享圖片

2、截斷日誌

[root@redhat7_1 ~]# mysqladmin -uroot -p flush-logs
[root@redhat7_1 ~]# ls /usr/local/mysql/data/
技術分享圖片

3、添加數據模擬故障

[root@redhat7_1 ~]# mysql -uroot -p
mysql> insert into school.student(name,score) values(‘user01‘,79);
mysql> delete from school.student where name=‘Bob‘; #註意這條sql語句模擬誤刪除
mysql> insert into school.student(name,score) values(‘user02‘,84);
mysql> insert into school.student(name,score) values(‘user03‘,83);

mysql> select * from school.student;
技術分享圖片

4、再次截斷日誌

[root@redhat7_1 ~]# mysqladmin -uroot -p flush-logs
[root@redhat7_1 ~]# ls /usr/local/mysql/data/

技術分享圖片

5、刪庫模擬故障

[root@redhat7_1 ~]# mysql -u root -p
mysql> drop database school;
mysql> quit

[root@redhat7_1 ~]# mysql -u root -p </opt/school.sql #導入完全備份數據

6、恢復數據

[root@redhat7_1 ~]# cd /usr/local/mysql/data/
[root@redhat7_1 data]# mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000004
技術分享圖片

[root@redhat7_1 data]# mysqlbinlog --no-defaults --stop-datetime=‘2018-09-03 18:52:11‘ mysql-bin.000004 | mysql -uroot -p123

#"stop-datetime"代表的是錯誤時間點,從二進制日誌文件開頭進行加載,一直到錯誤時間點結束

技術分享圖片

[root@redhat7_1 data]# mysqlbinlog --no-defaults --start-datetime=‘2018-09-03 18:52:17‘ mysql-bin.000004 | mysql -uroot -p123

#"start-datetime"代表的是正確操作時間點,從哪個時間點再進行開始

技術分享圖片

六、基於位置恢復數據

1、刪庫模擬故障

[root@redhat7_1 ~]# mysql -u root -p
mysql> drop database school;
mysql> quit

[root@redhat7_1 ~]# mysql -u root -p </opt/school.sql #導入完全備份數據

2、恢復數據

[root@redhat7_1 ~]# cd /usr/local/mysql/data/
[root@redhat7_1 data]# mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000004
技術分享圖片

[root@redhat7_1 data]# mysqlbinlog --no-defaults --stop-position=‘559‘ mysql-bin.000004 | mysql -uroot -p123

#"stop-position"代表的是錯誤位置,從二進制日誌文件開頭進行加載,一直到錯誤位置結束

技術分享圖片

[root@redhat7_1 data]# mysqlbinlog --no-defaults --start-position=‘664‘ mysql-bin.000004 | mysql -uroot -p123

#"start-position"代表的是正確操作位置,從哪個位置再進行開始

技術分享圖片

超詳細MySql備份策略