MySQL備份方案之Xtrabackup詳細(xì)解答
我們熟知的MySQL備份方案有:mysqldump、Xtrabackup、主從復(fù)制、文件系統(tǒng)快照等方案,而我們要使用哪一種需要根據(jù)具體情況去選擇。mysqldump是MySQL自己提供的邏輯備份工具,能導(dǎo)出數(shù)據(jù)庫中的數(shù)據(jù)、表結(jié)構(gòu)和其他信息,但是會對數(shù)據(jù)庫性能產(chǎn)生一定的影響,尤其是在數(shù)據(jù)量大的情況下,因為它需要執(zhí)行SQL查詢并將結(jié)果寫入備份文件,這可能會對數(shù)據(jù)庫服務(wù)器負(fù)載增加,當(dāng)然也有優(yōu)點,備份的數(shù)據(jù)庫文件可移植性好,可以在不同版本和架構(gòu)的 MySQL 服務(wù)器上使用。而Xtrabackup是一種物理備份工具,物理備份就是直接復(fù)制數(shù)據(jù)庫文件的方式來進(jìn)行備份,這種備份方法相對于邏輯備份(如mysqldump)來說通常更快速、占用的存儲空間較小。
在這里我們使用Xtrabackup備份,Xtrabackup主要有兩個工具:xtrabackup、innobackupex
xtrabackup下載安裝
# 下載到服務(wù)器
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.7/binary/tarball/percona-xtrabackup-2.4.7-Linux-x86_64.tar.gz
# 解壓
tar zxvf percona-xtrabackup-2.4.7-Linux-x86_64.tar.gz
# 把文件放到要存儲的位置
mv percona-xtrabackup-2.4.7-Linux-x86_64 /usr/local/xtrabackup
# 創(chuàng)建軟連接(可以不操作)
ln -s /usr/local/xtrabackup/bin/* /usr/bin/全量備份方案
1.這里備份執(zhí)行備份操作命令,按照步驟來。指定mysql配置文件,輸入賬號密碼,指定sock文件 ,指定數(shù)據(jù)備份目錄
??????注意:(./percona-xtrabackup-2.4.7-Linux-x86_64) 我是把名字改了,改成了(xtrabackup),所以要用(./xtrabackup)??????
# 正常情況下命令
./percona-xtrabackup-2.4.7-Linux-x86_64/bin/innobackupex --defaults-file=/etc/my.cnf --user=root --password='password' -S /var/lib/mysql/mysql.sock /data/mysql_bak/# 改了文件名字之后
./xtrabackup/bin/innobackupex --defaults-file=/etc/my.cnf --user=root --password='password' -S /var/lib/mysql/mysql.sock /data/mysql_bak/2.tar zcvf 備份文件名.tar.gz 備份文件名
tar zcvf 2024-01-08_00-05-12.tar.gz 2024-01-08_00-05-12全量數(shù)據(jù)恢復(fù)(停機恢復(fù))
第一種
1.先解壓數(shù)據(jù)備份文件
tar xf 2024-01-08_00-05-12.tar2.數(shù)據(jù)恢復(fù)我們還是使用xtrabackup,數(shù)據(jù)備份文件解壓完之后,我們需要對全量備份進(jìn)行事務(wù)的處理
./xtrabackup/bin/xtrabackup --apply-log /data/mysql_bak/2024-01-08_00-05-123.事務(wù)處理完之后把mysql停掉
# 我這里系統(tǒng)是centos6.9,所以用如下命令
service mysqld stop4.處理完事務(wù)的備份文件mv(mv:mv命令可以用來移動文件或者將文件改名)到mysql的數(shù)據(jù)文件中。然后需要對這個文件進(jìn)行授權(quán)
# 將數(shù)據(jù)移動到數(shù)據(jù)庫文件中 或者 修改一個名字
mv /data/mysql_bak/2024-01-08_00-05-12 dbfiles-2024.01.08
# 授權(quán),對當(dāng)前文件進(jìn)行授權(quán),這個文件我一般和mysql數(shù)據(jù)文件目錄放在一起
chown -R mysql. dbfiles-2024.01.08第二種
./xtrabackup/bin/innobackupex --defaults-file=/etc/my.cnf --copy-back /data/mysql_bak/2024-01-08_00-05-12--copy-back:做數(shù)據(jù)恢復(fù)時將備份數(shù)據(jù)文件拷貝到MySQL服務(wù)器的datadir 配置文件指向的數(shù)據(jù)目錄
??????注意:--copy-back參數(shù)需要數(shù)據(jù)目錄為空??????
全量數(shù)據(jù)恢復(fù)(在線恢復(fù))
1.使用 --apply-log 選項,執(zhí)行事務(wù)日志的恢復(fù)
./percona-xtrabackup-2.4.7-Linux-x86_64/bin/innobackupex --defaults-file=/etc/my.cnf --apply-log /data/mysql_bak/2.把MySQL數(shù)據(jù)目錄刪除,然后直接執(zhí)行以下命令
./xtrabackup/bin/innobackupex --defaults-file=/etc/my.cnf --copy-back /data/mysql_bak/2024-01-08_00-05-12--copy-back:做數(shù)據(jù)恢復(fù)時將備份數(shù)據(jù)文件拷貝到MySQL服務(wù)器的datadir 配置文件指向的數(shù)據(jù)目錄
??????注意:--copy-back參數(shù)需要數(shù)據(jù)目錄為空??????
3.更改 MySQL 數(shù)據(jù)目錄的所有者
chown -R mysql:mysql /var/lib/mysql4.重啟 MySQL 服務(wù)
重啟 MySQL 服務(wù),使更改生效:
service mysql restart增量備份方案
??????注意:xtrabackup和MySQL版本不匹配需要添加: --no-server-version-check ??????
1.這里使用xtrabackup進(jìn)行全量備份 ,前面全量備份是使用innobackupex進(jìn)行全量備份
# 這里要寫用戶名和密碼,并且要自己指定文件夾名稱(20240108)
./xtrabackup/bin/xtrabackup --backup -S /var/lib/mysql/mysql.sock -u root -p password --target-dir=/data/mysql_bak/full/202401082.在/data/mysql_bak/文件中創(chuàng)建一個增量備份目錄
cd /data/mysql_bak
mkdir increment3.進(jìn)行增量備份
進(jìn)行增量備份要指定是依照那一個全量備份進(jìn)行增量備份,說白了就是增量備份是在全量備份的基礎(chǔ)之上進(jìn)行
./xtrabackup/bin/xtrabackup --backup -S /var/lib/mysql/mysql.sock -u root -p password --target-dir=/data/mysql_bak/increment/inc-20240108 --incremental-basedir=/data/mysql_bak/full/202401084.增量備份文件備份好了之后需要對全量備份進(jìn)行事務(wù)處理,再將增量備份 和 全量備份文件進(jìn)行合并
??????注意:這里只給全量文件做事務(wù)處理,這里用的是xtrabackup做事務(wù)處理??????
# 對全量備份做事務(wù)處理
./xtrabackup/bin/xtrabackup --prepare --applay-log-only --target-dir=/data/mysql_bak/full/20240108
# 進(jìn)行數(shù)據(jù)合并 -> 將增量數(shù)據(jù)合并到全量數(shù)據(jù)中
./xtrabackup/bin/xtrabackup --prepare --target-dir=/data/mysql_bak/full/20240108 --incemental-dir=/data/mysql_bak/increment/inc-202401085.數(shù)據(jù)合并成功之后進(jìn)行恢復(fù)數(shù)據(jù)
# 先停止MySQL
service mysqld stop
# 修改配置文件my.cnf,將MySQL數(shù)據(jù)目錄指向新的數(shù)據(jù)備份文件
vim /etc/my.cnf
# 將數(shù)據(jù)移動到數(shù)據(jù)庫文件中 或者 修改一個名字
mv /data/mysql_bak/full/20240108 dbfiles-20240108
# 授權(quán),對當(dāng)前文件進(jìn)行授權(quán),這個文件我一般和mysql數(shù)據(jù)文件目錄放在一起
chown -R mysql. dbfiles-20240108
# 啟動MySQL
service mysqld start增量備份(停機恢復(fù))
# 先停止MySQL
service mysqld stop
# 修改配置文件my.cnf,將MySQL數(shù)據(jù)目錄指向新的數(shù)據(jù)備份文件
vim /etc/my.cnf
# 將數(shù)據(jù)移動到數(shù)據(jù)庫文件中 或者 修改一個名字
mv /data/mysql_bak/full/20240108 dbfiles-20240108
# 授權(quán),對當(dāng)前文件進(jìn)行授權(quán),這個文件我一般和mysql數(shù)據(jù)文件目錄放在一起
chown -R mysql. dbfiles-20240108
# 啟動MySQL
service mysqld start怎么恢復(fù)單獨某個表的數(shù)據(jù)
這里講兩種方式,其實都是一樣的套路
第一種:
a.從全備份中提取特定表的文件:
Percona XtraBackup創(chuàng)建的備份文件通常存儲在目標(biāo)目錄中,其中包含完整的數(shù)據(jù)庫備份。你可以在備份目錄中找到所有數(shù)據(jù)庫表的 .ibd 文件。對于 InnoDB 表,這些文件通常在
`../datadir/{database_name}/{table_name}.ibd`cp /path/to/backup/datadir/your_database/your_table_name.ibd /path/to/restore替換
/path/to/backup/datadir/your_database/your_table_name.ibd為備份中你想要恢復(fù)的表的路徑,/path/to/restore 為你想要還原表的目標(biāo)目錄
b.在 MySQL 中創(chuàng)建目標(biāo)數(shù)據(jù)庫和表
在 MySQL 中創(chuàng)建目標(biāo)數(shù)據(jù)庫和表,確保表的結(jié)構(gòu)與你要恢復(fù)的表一致。
CREATE DATABASE your_database;
USE your_database;
CREATE TABLE your_table_name (...); -- 包括表結(jié)構(gòu)c.更正表文件的權(quán)限
如果表文件的權(quán)限不正確,需要更正它們的所有權(quán):
sudo chown mysql:mysql /path/to/restore/your_table_name.ibdd.重建表索引
如果你導(dǎo)出的是 InnoDB 表,可能需要重新建立表的索引。在 MySQL 命令行中執(zhí)行:
ALTER TABLE your_table_name DISCARD TABLESPACE;
ALTER TABLE your_table_name IMPORT TABLESPACE;替換 your_table_name 為你的表名。
第二種:
a.直接刪除數(shù)據(jù)存儲文件中的對應(yīng)的idb文件
rm -rf table.idbb.然后把備份文件中對應(yīng)的文件copy過去,和第一種一樣
cp /path/to/backup/datadir/your_database/your_table_name.ibd /path/to/restorec.更正表文件的權(quán)限
如果表文件的權(quán)限不正確,需要更正它們的所有權(quán):
sudo chown mysql:mysql /path/to/restore/your_table_name.ibdd.重建表索引
如果你導(dǎo)出的是 InnoDB 表,可能需要重新建立表的索引。在 MySQL 命令行中執(zhí)行:
ALTER TABLE your_table_name DISCARD TABLESPACE;
ALTER TABLE your_table_name IMPORT TABLESPACE;替換 your_table_name 為你的表名。
??????注意:我們這里都是以InnoDB存儲引擎來測試??????
全量備份腳本
第一種
1.shell腳本寫好之后,再寫一個定時任務(wù)就OK了,這里是直接備份到`/data/mysql_bak/full/`目錄下,然后把數(shù)據(jù)打包,并且把備份的數(shù)據(jù)刪掉
#!/bin/bash
#0 3 * * * /bin/sh /data/mysql_bak-full.sh /dev/null 2>&1
# crazyitboy 20240108
export PATH=/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin
MySQL_USER=root
MYSQL_PWD=password
BAKDIR=/data/mysql_bak/full
MONTH=$(date +%m)
DAY=$(date +%d)
YEAR=$(date +%Y)
HOUR=$(date +%H)
MIN=$(date +%M)
DRINAME=$YEAR$MONTH$DAY$HOUR$MIN
BAKDIR_MYSQL=$BAKDIR/
BAK_TAR=${DRINAME}.tar.gz
TEMP_DIR=$BAKDIR/temp_dir/
if [ ! -d "$TEMP_DIR" ]; then
mkdir -p $TEMP_DIR
fi
/usr/local/xtrabackup/bin/innobackupex --defaults-file=/etc/my.cnf --user=${MySQL_USER} --password=${MYSQL_PWD} -S /var/lib/mysql/mysql.sock ${TEMP_DIR}
if [ $? -eq 0 ]; then
echo "innobackupex 備份完成!(OK?。?
else
echo "innobackupex 備份失?。。‵AIL?。?
exit
fi
cd ${TEMP_DIR}
PWDS=$(pwd)
if [ "${TEMP_DIR}" == "${PWDS}/" ]; then
BAK_TAR_NAME=${BAK_TAR}
tar -czf /data/mysql_bak/full/${BAK_TAR_NAME} *
[ $? != 0 ] && echo "tar -czf ${BAK_TAR_NAME} ${TEMP_DIR}* -R" && exit
echo "$TEMP_DIR 打包成功!"
cd $BAKDIR
RM_PWDS=$(pwd)
if [ "${BAKDIR}/" == "${RM_PWDS}/" ]; then
rm -rf temp_dir
fi
else
echo "$TEMP_DIR 打包失?。?
fi2.然后執(zhí)行定時任務(wù),每天3點執(zhí)行
0 3 * * * /bin/sh /data/mysql_bak/mysql_bak-full.sh /dev/null 2>&1第二種
1.使用vim /etc/mysql_bak-full.sh命令創(chuàng)建并編輯腳本
#!/bin/bash -
rm -rf /data/mysql_bak/full
xtrabackup --login-path=bkpuser_local --backup --target-dir=/data/mysql_bak/full2.使用chomd命令賦予/etc/mysql_bak-full.sh腳本執(zhí)行權(quán)限
chomd 755 /etc/mysql_bak-full.sh3.我們計劃每周日23點對MySQL進(jìn)行一次全量備份
# 使用 crontab -e 添加周期備份任務(wù)
crontab -e
0 23 * * 0 /bin/bash /etc/mysql_bak-full.sh
# 使用 crontab -l 查看周期任務(wù)
crontab -l增量備份腳本
??????注意:這里編寫用于第N次(這里以第2次為例)增量備份腳本,因為增量備份我這里是每天都需要備份??????
1.使用vim /etc/mysql_bak-inc2.sh命令創(chuàng)建并編輯腳本
#!/bin/bash -
rm -rf /data/mysql_bak/increment/inc2
xtrabackup --login-path=bkpuser_local --backup --target-dir=/data/mysql_bak/increment/inc2 --incremental-basedir=/data/mysql_bak/increment/inc12.使用chomd命令賦予/etc/mysql_bak-inc2.sh腳本執(zhí)行權(quán)限
chomd 755 /etc/mysql_bak-inc2.sh3.我們計劃每周一到周六23點對MySQL進(jìn)行一次增量備份
# 使用 crontab -e 添加周期備份任務(wù)
crontab -e
# 周一
0 23 * * 1 /bin/bash /etc/mysql_bak-inc1.sh
# 周一,以此類推
0 23 * * 2 /bin/bash /etc/mysql_bak-inc2.sh
# 使用 crontab -l 查看周期任務(wù)
crontab -l這里周二到周六腳本命名以此類推,1改成2,2改成3
# 查看定時任務(wù)狀態(tài)/停止定時任務(wù)/啟動定時任務(wù)/重啟定時任務(wù)
service crond status/stop/start/restart
版權(quán)所屬:SO JSON在線解析
原文地址:http://suancuo.cn/blog/484.html
轉(zhuǎn)載時必須以鏈接形式注明原始出處及本聲明。
如果本文對你有幫助,那么請你贊助我,讓我更有激情的寫下去,幫助更多的人。
