mariadb的備份和恢復(fù):xtrabackup

參考文章:https://www.cnblogs.com/f-ck-need-u/p/9018716.html

mariadb數(shù)據(jù)庫的備份與恢復(fù)
備份的狀態(tài):熱備、冷備、溫備。
熱備和溫備需要鎖定要備份的數(shù)據(jù)庫的讀,否則會(huì)引起臟讀等現(xiàn)象
冷備一般在數(shù)據(jù)庫主備的備服務(wù)器上使用。
備份的方法:mysqldump/lvm/xtrabackup
musqldump:熱備innodb、溫備myisam,基于邏輯實(shí)現(xiàn).處理較大數(shù)據(jù)文件能力弱。
lvm: 幾乎熱備,物理實(shí)現(xiàn)。導(dǎo)出前需鎖定數(shù)據(jù)庫——復(fù)制文件——解鎖數(shù)據(jù)庫。
xtrabackup:支持熱備(物理)、溫備。
備份的方式:完全備份,增量備份,差異備份。
生產(chǎn)中需編寫定時(shí)腳本,每周完全備份一次,每天增量備份一次。數(shù)據(jù)庫文件和二進(jìn)制日志和配置文件及腳本函數(shù)存放本地、云端、其他存儲(chǔ)服務(wù)器(有冗余能力raid10)
xtrabackup是上述備份工具中性能較為優(yōu)越的
安裝xtrabackup,https://www.percona.com/downloads/XtraBackup/LATEST/
innobackupex工具是基于c語言編寫的xtrabackup輕量級(jí)使用工具
備份前的準(zhǔn)備工作:

[root@localhost mysql]# vim /etc/my.cnf #也可在mysql的其它配置文件中配置,范圍越小,越先生效[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log_bin=ON    #此處增加
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
skip_name_resolve=ON
innodb_file_per_table=ON
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

log_bin=ON 此處ON為mysql默認(rèn)位置也可自定義位置如log_bin=/data/mysql/log/server
此路徑需屬主屬組為mysql.mysql
chown -R mysql:mysql /data/mysql/log
ll /data/mysql/log

[root@localhost mysql]# systemctl restart mariadb
[root@localhost mysql]# mysql -uroot -p123456
MariaDB [(none)]> show master logs;
+-----------+-----------+
| Log_name  | File_size |
+-----------+-----------+
| ON.000001 |       245 |
+-----------+-----------+
1 row in set (0.00 sec)

MariaDB [(none)]> show master status;
+-----------+----------+--------------+------------------+
| File      | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-----------+----------+--------------+------------------+
| ON.000001 |      245 |              |                  |
+-----------+----------+--------------+------------------+
1 row in set (0.00 sec)

開啟innobackupex備份:
innobackupex --user=dbusername --password=dbpasswd /path/to/bakdir 備份文件存放位置

[root@localhost mysql]# innobackupex --user=root --password=123456 /var/lib/mysql/bakdir/
[root@localhost mysql]# du -sh bakdir/2019-08-01_21-58-40/*
4.0K    bakdir/2019-08-01_21-58-40/backup-my.cnf
0       bakdir/2019-08-01_21-58-40/bakdir
112K    bakdir/2019-08-01_21-58-40/hidb
4.0K    bakdir/2019-08-01_21-58-40/HIDB
18M     bakdir/2019-08-01_21-58-40/ibdata1
112K    bakdir/2019-08-01_21-58-40/mydb
1000K   bakdir/2019-08-01_21-58-40/mysql
212K    bakdir/2019-08-01_21-58-40/performance_schema
0       bakdir/2019-08-01_21-58-40/test
4.0K    bakdir/2019-08-01_21-58-40/test2
1.8M    bakdir/2019-08-01_21-58-40/wordpress
4.0K    bakdir/2019-08-01_21-58-40/xtrabackup_binlog_info
4.0K    bakdir/2019-08-01_21-58-40/xtrabackup_checkpoints
4.0K    bakdir/2019-08-01_21-58-40/xtrabackup_info
4.0K    bakdir/2019-08-01_21-58-40/xtrabackup_logfile

xtrabackup會(huì)生成幾個(gè)文件:
backup-my.cnf 當(dāng)前配置文件的部分拷貝,只包含[mysqld]配置片段和備份有關(guān)的選項(xiàng)
xtrabackup_binlog_info中記錄的是當(dāng)前使用的二進(jìn)制日志文件

ON.000001   245

xtrabackup_checkpoints中記錄了備份的類型是全備還是增備,還有備份的起始、終止LSN號(hào)

backup_type = full-backuped
from_lsn = 0
to_lsn = 2880061
last_lsn = 2880061
compact = 0
recover_binlog_info = 0
flushed_lsn = 2880061

xtrabackup_info中記錄了本次備份的基礎(chǔ)信息

uuid = 7bc47b21-b464-11e9-a3bc-000c29de405f
name = 
tool_name = innobackupex
tool_command = --user=root --password=... /var/lib/mysql/bakdir/
tool_version = 2.4.15
ibbackup_version = 2.4.15
server_version = 5.5.60-MariaDB
start_time = 2019-08-01 21:58:42
end_time = 2019-08-01 21:58:47
lock_time = 0
binlog_pos = filename 'ON.000001', position '245'
innodb_from_lsn = 0
innodb_to_lsn = 2880061
partial = N
incremental = N
format = file
compact = N
compressed = N
encrypted = N

xtrabackup_logfile是復(fù)制和監(jiān)控后寫的redo日志。該日志是備份后下一個(gè)操作"準(zhǔn)備"的關(guān)鍵。只有通過它才能實(shí)現(xiàn)數(shù)據(jù)一致性。

備份之后并不能立刻開始恢復(fù),因?yàn)閭浞輹r(shí)可能會(huì)有未提交或未完成的事務(wù),xtrabackup在備份時(shí)會(huì)監(jiān)控此類事務(wù),在備份完成后讀取此監(jiān)控,該回滾的回滾,該前滾的前滾(innodb表)。此操作為--apply-log,xtrabackup的準(zhǔn)備階段。此操作不需開啟數(shù)據(jù)庫。

innobackupex --apply-log /var/lib/mysql/bakdir/2019-08-01_21-58-40/
.........
InnoDB: FTS optimize thread exiting.
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 2886346
190801 23:03:35 completed OK!

在準(zhǔn)備階段,有一個(gè)內(nèi)存使用量選項(xiàng)"--use-memory",該選項(xiàng)默認(rèn)值為100M,值越大準(zhǔn)備的過程越快。當(dāng)然,將該值加大的前提是服務(wù)器內(nèi)存夠用。
innobackupex的全備份恢復(fù)
innobackupex全備份恢復(fù)要求目標(biāo)主機(jī)的mariadb處于關(guān)閉狀態(tài),且其datadir文件夾必須為空!
systemctl stop mariadb
cat /etc/my.cnf 查看datadir路徑
rm -rf /var/lib/mysql/*
innobackupex的恢復(fù)依靠--copy-back ,選項(xiàng)后指定恢復(fù)的源目錄。

innobackupex --copy-back /tmp/backfile/2019-08-01_21-58-40/
190801 23:42:45 completed OK!
[root@localhost lib]# chown -R mysql:mysql mysql/  #更改datadir路徑下文件屬組屬主為mysql:mysql

屬主屬組別忘了改!
恢復(fù)完成,進(jìn)入數(shù)據(jù)庫查看吧。

增量備份
xtrabackup增量備份是基于完全備份基礎(chǔ)上實(shí)現(xiàn)的,通過比對(duì)全備份的終點(diǎn)LSN和當(dāng)前的LSN實(shí)現(xiàn):增備時(shí)將從終點(diǎn)LSN開始一直備份到當(dāng)前的LSN。在備份時(shí)也有redo log的監(jiān)控線程,對(duì)于增備過程中導(dǎo)致LSN增長的操作也會(huì)寫入到日志中。

增量備份僅能應(yīng)用于InnoDB或XtraDB表,對(duì)于MyISAM表而言,執(zhí)行增量備份時(shí)其實(shí)進(jìn)行的是完全備份。

默認(rèn)情況下,增備的起始LSN是自動(dòng)獲取的,但是在某些情況下無法獲取,還有些情況下無法獲取到將要增備的basedir。xtrabackup提供的選項(xiàng)"--incremental-lsn=N"可以顯式指定增備的起始LSN,顯式指定LSN時(shí),可以無需提供增備的basedir。(建議)

[root@localhost mysql]# innobackupex --password=1223456 /backup/
#登錄數(shù)據(jù)庫修改數(shù)據(jù),做第一次增量備份
[root@localhost mysql]# innobackupex --password=123456 --incremental /backup/ --incremental-basedir=/backup/2019-08-02_00-19-58/
[root@localhost mysql]# innobackupex --apply-log --redo-only /backup/2019-08-02_00-19-58 
#整理全備份,回滾未提交的事務(wù)。
[root@localhost mysql]# cat /backup/2019-08-02_00-19-58/xtrabackup_checkpoints 
backup_type = log-applied
from_lsn = 0
to_lsn = 2883423
last_lsn = 2883423
compact = 0
recover_binlog_info = 0
flushed_lsn = 2883423
# 查看全備份結(jié)束lsn號(hào):2883423
[root@localhost backup]# innobackupex --apply-log  /backup/2019-08-02_01-02-03/ --incremental-dir /backup/2019-08-02_01-02-52/ #這里的日期是重做了一次的
[root@localhost backup]# innobackupex --apply-log  /backup/2019-08-02_01-02-03 #整合所有備份 這一步可以不做,因?yàn)榇饲耙呀?jīng)將最后一次增量整合到全備份中了。
[root@localhost backup]# innobackupex --copy-back /tmp/backfile/2019-08-02_01-02-03

--incremental-basedir指的是基于誰做的增量備份,INCREMENTAL-DIR指的是第一次增量備份的目錄,--redo-only表示備份回滾事務(wù),每一備份操作到最后一次增量備份之前的每一次備份都需要單獨(dú)做一次,可以在全部備份完后做。

導(dǎo)入或?qū)С鰡螐埍?br> (1)“導(dǎo)出”表
導(dǎo)出表是在備份的prepare階段進(jìn)行的,因此,一旦完全備份完成,就可以在prepare過程中通過--export選項(xiàng)將某表導(dǎo)出了:

innobackupex --apply-log --export /path/to/backup

此命令會(huì)為每個(gè)innodb表的表空間創(chuàng)建一個(gè)以.cfg和.exp再加上.ibd文件結(jié)尾的文件,這些文件則可以用于導(dǎo)入至其它服務(wù)器。

[root@localhost backup]# innobackupex --apply-log --export ./2019-08-02_01-02-03/

(2)“導(dǎo)入”表
要在mysql服務(wù)器上導(dǎo)入來自于其它服務(wù)器的某innodb表,需要先在當(dāng)前服務(wù)器上創(chuàng)建一個(gè)跟原表表結(jié)構(gòu)一致的表,而后才能實(shí)現(xiàn)將表導(dǎo)入:
mysql> CREATE TABLE mytable (...) ENGINE=InnoDB;

然后將此表的表空間刪除:
mysql> ALTER TABLE mydatabase.mytable DISCARD TABLESPACE;

接下來,將來自于“導(dǎo)出”表的服務(wù)器的mytable表的mytable.ibd和mytable.exp和myrable.cfg文件復(fù)制到當(dāng)前服務(wù)器的數(shù)據(jù)目錄,然后使用如下命令將其“導(dǎo)入”:
mysql> ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容