超詳細MySql備份策略
在生產環境中,數據的安全性是至關重要的,任何數據的丟失都可能產生嚴重的後果。重要性可以體現為以下幾點:
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備份策略