參考文章: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;