備份和恢復
為什么要備份?
災難恢復:硬件故障、軟件故障、自然災害、黑客攻擊、誤操作
測試
要注意的點:
備份需要多少時間
能夠容忍多少的數據丟失
恢復數據需要在多長時間完成
需要恢復哪些數據
1、做還原測試,用戶測試備份的可用性
2、還原演練
備份的時長很重要,備份是要消耗磁盤io的。
還要做數據庫配置文件參數的備份。
備份類型
完全備份,部分備份
完全備份:整個數據集
部分備份:只備份數據子集
完全備份、增量備份、差異備份
增量備份:只備份最近一次完全備份或者增量備份以來的變化的數據。
差異備份:僅備份最近一次完全備份以來的變化的數據。
熱備、溫備、冷備
熱備:讀寫操作均能執行
溫備:讀操作可以,但是寫不行
冷備:讀寫操作均不能執行
Myisam:溫備、不能熱備;
Innodb:熱備;
物理備份、邏輯備份
物理備份:直接復制數據文件進行備份,與存儲引擎無關。
邏輯備份:從數據庫‘導出’數據另存進行備份。
物理備份——直接拷貝,你要確保沒有數據寫入,所以物理備份最好使用溫備,先將表鎖住。
邏輯備份——二進制日志
備份時要考量的因素
持續多久
備份過程的時間長
備份負載:如果負載較高,可能需要停掉。
恢復時間長短
備份的時候做好先后手,如果不行怎么辦?不行怎么退出?
備份什么
數據
二進制日志,innodb的事務日志
代碼(存儲過程、存儲函數、觸發器、時間調度器)
服務器的配置文件,各個參數設置
設計備份方案
數據集:完全備份+增量備份+二進制日志 | 完全備份+差異備份+二進制日志
備份手段:物理備份、邏輯備份
對於較大體量的數據建議使用物理備份,對於較小的數據建議使用邏輯備份。
物理備份和邏輯備份,兩種備份方式的恢復時間有差異。
備份工具的選擇
mysqldump+復制binlog:
mysqldump:完全備份
復制binlog中指定時間范圍的event:增量備份
lvm2快照+復制binlog
lvm2快照:適用cp或者tar等做物理備份:完全備份
復制binlog中指定時間范圍的event:增量備份
xtrabackup|mariabackup
由percona提供的支持對Innodb做熱備的工具:物理備份
既可以做全量也可以做增量
mysqldump——邏輯備份工具
lvm2和xtrabackup|mariabackup——都是物理備份工具
lvm2——確保數據庫沒有任何的數據寫入,也即要鎖表。
備份、恢復方法
基於二進制文件的恢復:
方式一、
算好要恢復的數據的時間段,將其中的binlog記錄的sql語句重定向輸出到bin.sql文件中
mysqlbinlog --start-datetime=“2019-06-08 22:55:13” --stop-datetime="2019-06-08 22:58:11" mysql-bin.000001 > bin.sql
進入數據庫,source一下這個文件
source bin.sql
方式二、
mysqlbinlog /var/lib/mysql/mysql-bin.000005 --stop-position=1389 | msyql -uroot -proot
#沒有start就從頭開始,有start就依據start開始
lvm2備份恢復:
pvcreate /dev/sdb1
vgcreate testvg /dev/sdb1
lvcreate -L 1G -n testlv testvg
mkfs -t ext4 /dev/testvg/testlv
mount /dev/testvg/testlv /test #寫入/etc/fstab 或者/etc/rc.local來讓它開機自動掛載
#掛載使用,將/test設置為數據庫的數據存儲目錄,然后依照lvm2快照來對其中的數據進行快照備份。
然后使用卷快照來備份數據
1、lvm2是物理備份,先鎖表
flush tables with read lock;
2、快照
lvcreate -L 1G -s -p rw -n snap_testlv /dev/testvg/testlv
-L —— --size
-s —— --snap
-p —— --permission rw|r
-n —— --name
/dev/testvg/testlv : 參照復制的目錄
3、unlock tables;
#鎖表之后一定要記得解鎖
4、mount /dev/testvg/snap_testlv /snap_test #掛載使用,數據驗證
#這里需要注意的是,xfs文件系統不支持卷快照
#這個時候你就可以在/snap_test中cp其中的內容了。
#note:還原的時候要確保的你的屬主和屬組都是mysql,如果是root那么數據庫會出問題。
mariabackup:物理備份工具
Xtrabackup——是mysql的備份工具,實際上也可以用於mariadb,但是僅限於10以前。
10以后要用mariabackup
Mariabackup:
物理備份工具,可以實現在線備份。
它是根據事務日志來備份的,在10.3.x及以上版本使用xtrabackup工具會有問題,原因可能是10.3版本的redo日志格式和以前不一樣了。
#note:事務日志要刪除就成對成組刪除,刪除單個可能會讓數據失去一致性,數據庫會起不來。
安裝:
yum install MariaDB-backup #前提是有MariaDB的源
全備+恢復:
1、全量備份
mariabackup --backup --target-dir=/root/fullbackup --user=root --password=root
2、准備全備數據
mariabackup --prepare --target-dir=/root/fullbackup --user=root --password=root
3、還原數據(確保數據目錄為空)
mariabackup --copy-back --target-dir=/root/fullbackup --user=root --password=root
4、修改屬組屬主
chown -R mysql.mysql /var/lib/mysql
全量+增量+恢復:
1、全量備份
mariabackup --backup --target-dir=/root/fullbackup --user=root --password=root
2、增量備份
mariabackup --backup --target-dir=/root/inc1 --incremental-basedir=/root/fullbackup --user=root --password=root
3、准備全備數據
mariabackup --prepare --target-dir=/root/fullbackup --user=root --password=root
4、增量和全備的合並
mariabackup --prepare --target-dir=/root/fullbackup --user=root --password=root --incremental-dir=/root/inc1/ --apply-log-only
--apply-log-only:在准備增量備份時,必須跳過未提交事務的回滾,使用--apply-log-only選項防止回滾階段
5、恢復數據(確保數據目錄下是空的)
mariabackup --copy-back --target-dir=/root/fullbackup --user=root --password=root
6、修改屬組屬主
chown -R mysql.mysql /var/lib/mysql
如果增量不止一個呢?怎么合並? 一直去合並就可以,做增量的時候一定要加上--apply-log-only。
mysqldump邏輯備份工具:
#備份testdb數據庫(-l表示備份單個數據庫的時候鎖定該庫的所有表,-x當對所有的數據庫備份時鎖定所有數據庫的所有表)
mysqldump -uroot -proot -l --databases testdb > testdb.sql
#備份所有數據庫
mysqldump -uroot -proot -x --all-databases > all_databases.sql
#備份testdb數據庫下的students表
mysqldump -uroot -proot testdb students > students.sql
#如果要備份多個表那么使用空格隔開即可。
mysqldump -uroot -proot testdb students test_table > both.sql
#還原數據(sql命令)
source testdb.sql #注意文件的路徑,在當前工作目錄之下。
#涉及鎖表,溫備;Mysqldump不能實現增量備份。
全備+增量+二進制——>恢復 #還要去篩選一下二進制文件的時間
當數據上了一定的量級之后,使用mysqldump去備份只能是杯水車薪。
數據庫更換目錄
如果是由yum安裝的數據庫,默認數據目錄是在/var/lib/mysql,如果需要更改:
vim /etc/my.cnf.d/server.cnf
[mysqld]
datadir=/test3/
pid_file=/test3/localhost.pid
socket=/test3/mysql.sock
wsrep_data_home_dir=/test3/
log-bin=mysql-bin
[client]
socket=/test3/mysql.sock
chown -R mysql.mysql /test3
#重啟數據庫:service mariadb restart
然后進入數據庫查看dir:
show variables like ’%datadir%‘;
#實際上寫入配置文件的都是參數