mysql的備份和恢復
mysql的備份和恢復
備份類型:
完全備份指的是備份整個數據集( 即整個數據庫 )
部分備份指的是備份部分數據集(例如: 只備份一個表)
增量備份指的是備份自上一次備份以來(增量或完全)以來變化的數據; 特點: 節約空間、還原麻煩
差異備份指的是備份自上一次完全備份以來變化的數據 特點: 浪費空間、還原比增量備份簡單
備份策略:
本文介紹第一種備份方法,使用系統自帶的工具mysqldump,mysqldump只支持全量備份
mysqldump:
全量+binlog
MyISAM存儲引擎:支持溫備,備份時要鎖定表;
-x, --lock-all-tables:鎖定所有庫的所有表,讀鎖;
-l, --lock-tables:鎖定指定庫所有表;
InnoDB存儲引擎:支持溫備和熱備;
--single-transaction:創建一個事務,基於此快照執行備份;
其它選項:
-R, --routines:備份指定庫的存儲過程和存儲函數;
--triggers:備份指定庫的觸發器;
-E, --events:
--master-data[=#]
1:記錄為CHANGE MASTER TO語句,此語句不被註釋;
2:記錄為CHANGE MASTER TO語句,此語句被註釋;
--flush-logs:鎖定表完成後,即進行日誌刷新操作;
1、首先我們創建一個數據庫和屬於這個數據庫的某個表
MariaDB [(none)]> create database hidb;
MariaDB [(none)]> use hidb; MariaDB [hidb]> create table students(id int unsigned auto_increment primary key,name char(30) not null,age tinyint unsigned,gender ENUM(‘F‘,‘M‘),major varchar(200)); MariaDB [hidb]> desc students;查看表結構
2、然後向表中插入一些數據
創建一個數組,給hidb這個庫中的students表中自動添加一些內容,要求姓名自動遞增,年齡對80取模加上18,性別定義數組隨機為F或M
[root@bixia ~]#GENDER=(‘F‘ ‘M‘) [root@bixia ~]#echo ${GENDER[0]} [root@bixia ~]#echo ${GENDER[1]} [root@bixia ~]#for i in {1..1000}; do mysql -e "insert into hidb.students(id,name,age,gender) values(‘$i‘,‘stu$i‘,‘$[$RANDOM%80+18]‘,‘${GENDER[$RANDOM%2]}‘);";done MariaDB [hidb]> select * from students; ..... ..... ..... | 998 | stu998 | 38 | F | NULL | | 999 | stu999 | 91 | F | NULL | | 1000 | stu1000 | 80 | M | NULL | +------+---------+------+--------+--------------+
3、最後啟動二進制日誌
創建一個目錄存放數據和日誌文件
[root@bixia ~]#mkdir -pv /mydata/{data,logs} mkdir: created directory ‘/mydata’ mkdir: created directory ‘/mydata/data’ 存放數據 mkdir: created directory ‘/mydata/logs’ [root@bixia ~]#chown -R mysql.mysql /mydata/* 將/mydata/目錄下的所屬者和所屬組改為mysql [root@bixia ~]#vim /etc/my.cnf.d/server.cnf 編輯配置文件指定二進制日誌存放的路徑 [server] log_bin = /mydata/logs/master-log 不用加後綴 [root@bixia ~]#systemctl restart mariadb 重啟服務讓日誌文件生效 [root@bixia ~]mysql MariaDB [hidb]> set @@session.sql_log_bin=on; 啟動二進制日誌記錄 MariaDB [hidb]> grant all on *.* to root@‘172.18.77.%‘ identified by ‘centos‘; 授權用戶可以通過遠程登錄連接
4、上述所有的環境以經準備就緒了;接下來我們準備另外一臺服務器以供備份數據
[root@bixia ~]#mysqldump -uroot -pcentos -h172.18.77.7 --single-transaction -R --triggers -E --databases hidb --master-data=2 --flush-logs > /root/hidb-$(date +%F-%H-%M-%S).sql
[root@bixia ~]#mysql < hidb-2017-11-14-11-38-09.sql 備份恢復
到這裏就備份完成了,但是如何在備份從這裏已經備份的之後的數據呢 ,這就是增量備份了,利用二進制日誌進行備份
5、我們來模擬一下,比如我們在原來的主的mysql服務器上分別刪除一行數據個插入一行數據
MariaDB [hidb]> delete from students where id=999; MariaDB [hidb]> insert into students (name,age,gender) values (‘Huangshang‘,‘30‘,‘M‘);
在另外一臺主機上的備份數據庫中是看不到這些刪除和插入的數據的
[root@bixia ~]#less hidb-2017-11-14-11-38-09.sql 查看這二個文件可以看到從哪裏開始增填新的內容,以供參考備份使用
匹配到是master-log.000006這個日誌,從245字節開始
[root@bixia logs]#mysqlbinlog -j 245 master-log.000006 > /tmp/binlog.sql [root@bixia logs]#scp /tmp/binlog.sql 172.18.77.77:/root/
[root@bixia ~]#mysql < binlog.sql 備份恢復
6、最後登錄查看
在主服務器上刪除的999行數據和新插入的一行數據已經備份到最新的數據了
註意:由於上述兩臺主機的主機名都是bixia,所以有可能區分不了哪臺是主的mysql,哪個是用於備份的mysql主機,為了方便自己分的清楚建議修改主機名不一樣,以防混淆。
mysql的備份和恢復