1.數(shù)據(jù)庫備份的分類
1.1 數(shù)據(jù)備份的重要性
1.2 數(shù)據(jù)庫備份的分類
數(shù)據(jù)庫備份
物理備份:直接對數(shù)據(jù)庫的數(shù)據(jù)文件或者日志文件進行備份.
邏輯備份:對數(shù)據(jù)庫的庫或表對象進行備份.
備份策略
完全備份:每次備份都備份完整的數(shù)據(jù)庫.
- 是對整個數(shù)據(jù)庫、數(shù)據(jù)庫結(jié)構(gòu)和文件結(jié)構(gòu)的備份。
- 保存的是備份完成時刻的數(shù)據(jù)庫。
- 是差異備份與增量備份的基礎(chǔ)。
差異備份:只備份上一次完全備份后的更新數(shù)據(jù).
增量備份:每次備份只備份上一次完全備份或增量備份后的最新數(shù)據(jù).完全備份
增量備份
差異備份
1.3 常見的備份方法
物理冷備
-
備份時數(shù)據(jù)庫處于關(guān)閉狀態(tài),直接打包數(shù)據(jù)庫文件
-
備份速度快,恢復(fù)時也是最簡單的
專用備份工具mysqldump或mysqlhotcopy
-
mysqldump常用的邏輯備份工具
-
mysqlhotcopy僅擁有備份MylSAM和ARCHIVE表
啟用二進制日志進行增量備份
- 進行增量備份,需要刷新二進制日志
第三方工具備份
- 免費的MySQL熱備份軟件Percona XtraBackup
2.MySQL完全備份與恢復(fù)
2.1 MySQL完全備份
優(yōu)點
備份與恢復(fù)操作簡單方便
缺點
- 數(shù)據(jù)存在大量的重復(fù)
- 占用大量的備份空間
- 備份與恢復(fù)時間長
2.2 數(shù)據(jù)庫完全備份分類
物理冷備份與恢復(fù)
- 關(guān)閉MySQL數(shù)據(jù)庫
- 使用tar命令直接打包數(shù)據(jù)庫文件夾
- 直接替換現(xiàn)有MySQL目錄即可
補充:
tar zcvf 歸檔文件 原數(shù)據(jù)文件/目錄 gzip
tar jcvf 歸檔文件 原數(shù)據(jù)文件/目錄 bzip2
tar Jcvf 歸檔文件 原數(shù)據(jù)文件/目錄 xz
mysqldump備份與恢復(fù)
- MySQL自帶的備份工具,可方便實現(xiàn)對MySQL的備份
- 可以將指定的庫、表導(dǎo)出為SQL腳本
- 使用命令mysql導(dǎo)入備份的數(shù)據(jù)
2.3 MySQL物理冷備份及恢復(fù)
物理冷備份
先關(guān)閉數(shù)據(jù)庫,然后打包備份相關(guān)數(shù)據(jù)庫文件;
systemctl stop mysqld
mkdir /opt/backup #將數(shù)據(jù)庫備份文件保存到/opt/backup目錄下
cd /usr/local/mysql
tar zcf /opt/backup/mysql_data-$(date +%F).tar.gz data/
cd /opt/backup/
tar tf mysql_data-2023-06-19.tar.gz #查看tar壓縮包里的數(shù)據(jù)文件
tar xf mysql_data-2023-06-19.tar.gz #解壓縮tar壓縮包里的數(shù)據(jù)文件
恢復(fù)數(shù)據(jù)庫
說明:
上面?zhèn)浞莸臄?shù)據(jù)庫文件數(shù)據(jù)mysql_data-2023-06-19.tar.gz,作為遠端異地已經(jīng)備份好的數(shù)據(jù)庫文件(IP:192.168.80.60),然后加載到另一臺需要恢復(fù)的數(shù)據(jù)庫主機(IP:192.168.80.70)。
###遠端已備份數(shù)據(jù)文件主機(IP:192.168.80.60)
cd /opt/backup
scp mysql_data-2023-06-19.tar.gz 192.168.80.70:/opt
###需要恢復(fù)數(shù)據(jù)庫文件主機(IP:192.168.80.70)
systemctl stop mysqld
cd /opt
tar xf mysql_data-2023-06-19.tar.gz
mv /usr/local/mysql/data /usr/local/mysql/data.bak #將原有的數(shù)據(jù)庫文件移走
mv /opt/data/ /usr/local/mysql/
systemctl restart mysqld #重新啟動數(shù)據(jù)庫服務(wù)
mysql -uroot -p111 #此數(shù)據(jù)庫密碼為之前備份數(shù)據(jù)庫的密碼
2.4 數(shù)據(jù)遷移DST
DTS (Data Transmission Service,數(shù)據(jù)傳輸服務(wù)),用于在關(guān)系型數(shù)據(jù)庫、NoSQL數(shù)據(jù)庫、數(shù)據(jù)倉庫之間遷移數(shù)據(jù)??梢允褂肈TS將數(shù)據(jù)遷移至阿里云,也可以在阿里云和本地數(shù)據(jù)系統(tǒng)之間做數(shù)據(jù)遷移。
DTS的優(yōu)勢
相比傳統(tǒng)的數(shù)據(jù)傳輸工具,DTS的優(yōu)勢:
(1) 傳輸過程中保證高穩(wěn)定性
(2) 支持多種數(shù)據(jù)傳輸方式,包括:數(shù)據(jù)遷移、數(shù)據(jù)集成、數(shù)據(jù)同步、數(shù)據(jù)訂閱。
(3) 支持各種數(shù)據(jù)源直接的數(shù)據(jù)遷移。(如MySQL,redis等)
(4) 支持多種數(shù)據(jù)庫引擎作為源和目標
(5) 支持斷點續(xù)傳:避免了硬件和網(wǎng)絡(luò)故障導(dǎo)致的中斷
(6) 支持定時任務(wù)
數(shù)據(jù)遷移總結(jié):
體量小:
物理冷備 打包備份+恢復(fù)體量中等:
DTS體量超大:
數(shù)據(jù)魔方
2.5 mysqldump進行邏輯備份
2.5.1 mysqldump備份數(shù)據(jù)庫
備份指定數(shù)據(jù)庫文件:
mysqldump -u用戶名 -p密碼 --databases 數(shù)據(jù)庫名 > 指定路徑的絕對路徑/數(shù)據(jù)庫名.sql
###將數(shù)據(jù)庫gzy的數(shù)據(jù)文件備份到/opt/backup目錄下,并重命名為gzy.sql
mysqldump -uroot -p111 --databases gzy > /opt/backup/gzy.sql
vim /opt/backup//gzy.sql
###同時備份gzy和mysql兩個數(shù)據(jù)庫文件
mysqldump -uroot -p111 --databases gzy mysql > /opt/backup/mysql_gzy.sql
備份所有數(shù)據(jù)庫文件:
mysqldump -u用戶名 -p密碼 --all-databases > 指定路徑的絕對路徑/all.sql
###備份所有數(shù)據(jù)庫中的數(shù)據(jù)庫文件數(shù)據(jù)
mysqldump -uroot -p111 --all-databases > /opt/backup/all-databases.sql
###過濾出備份文件中,不以“--”和"/*"開頭,并且以“CREATE DATABASE”開頭的數(shù)據(jù)行
cat all-databases.sql | grep -v "^--" | grep -v "^/\*" | grep "^CREATE DATABASE"
2.5.2 mysqldump備份數(shù)據(jù)表
備份指定數(shù)據(jù)庫中的表數(shù)據(jù)文件:
mysqldump -u用戶名 -p密碼 數(shù)據(jù)庫名 表名 > 指定路徑的絕對路徑/數(shù)據(jù)庫名_表名.sql
###備份gzy數(shù)據(jù)庫中clr表數(shù)據(jù)內(nèi)容
mysqldump -uroot -p111 gzy clr > /opt/backup/gzy_clr.sql
vim /opt/backup/gzy_clr.sql
備份指定數(shù)據(jù)庫中的所有表數(shù)據(jù)文件:
mysqldump -u用戶名 -p密碼 數(shù)據(jù)庫名 > 指定路徑的絕對路徑/數(shù)據(jù)庫名_all.sql
###備份gzy數(shù)據(jù)庫中的所有表數(shù)據(jù)內(nèi)容,會包含gzy數(shù)據(jù)庫中的所有表信息,但不包括創(chuàng)建數(shù)據(jù)庫的操作
mysqldump -uroot -p111 gzy> /opt/backup/gzy_all.sql
vim /opt/backup/gzy_all.sql
2.6 數(shù)據(jù)庫備份總結(jié)
完全備份
物理冷備:
先關(guān)閉mysqld服務(wù),使用tar命令打包備份數(shù)據(jù)庫的數(shù)據(jù)目錄/文件 /usr/local/mysql/data/
mysqldump、xtrabackup等工具來邏輯備份
###備份單庫或多庫
mysqldump -uXXX -pXXX --databases 庫1 [庫2] ... > XXX.sql
###備份所有的庫
mysqldump -uXXX -pXXX --all-databases > XXX.sql
###備份庫中的一個或多個表數(shù)據(jù)(不包含創(chuàng)建庫的操作)
mysqldump -uXXX -pXXX 庫名 表1 表2 ... > XXX.sql
###備份庫中的所有表數(shù)據(jù)(不包含創(chuàng)建庫的操作)
mysqldump -uXXX -pXXX 庫名 > XXX.sql
3. 恢復(fù)數(shù)據(jù)庫
3.1 使用source命令恢復(fù)數(shù)據(jù)庫
使用source命令恢復(fù)數(shù)據(jù)庫的備份文件;
###查看gzy數(shù)據(jù)庫中的clr表的數(shù)據(jù)文件信息(免交互登錄數(shù)據(jù)庫的方式)
mysql -uroot -p111 -e "select * from gzy.clr;"
###刪除指定數(shù)據(jù)庫gzy
mysql -uroot -p111 -e "drop database gzy;"
###登錄數(shù)據(jù)庫
mysql -uroot -p111
###使用source命令恢復(fù)指定數(shù)據(jù)庫文件
source /opt/backup/gzy.sql;
注意:
在使用數(shù)據(jù)庫備份文件恢復(fù)具體數(shù)據(jù)庫時,可以直接使用source命令直接恢復(fù)數(shù)據(jù)庫;但是在使用指定指定數(shù)據(jù)庫中的數(shù)據(jù)表備份文件恢復(fù)數(shù)據(jù)時,需要先創(chuàng)建數(shù)據(jù)庫,然后切換到新創(chuàng)建的數(shù)據(jù)庫中,使用source命令恢復(fù)數(shù)據(jù)文件。
mysql -uroot -p111 -e "drop database gzy;"
###登錄數(shù)據(jù)庫
mysql -uroot -p111
###先創(chuàng)建數(shù)據(jù)庫kgc,然后切換到新創(chuàng)建的數(shù)據(jù)庫kgc中
create database kgc;
use kgc;
###恢復(fù)數(shù)據(jù)庫中的數(shù)據(jù)表文件數(shù)據(jù)
source /opt/backup/gzy_clr.sql;
select * from clr;
3.2 使用mysql命令恢復(fù)數(shù)據(jù)庫
3.2.1 重定向方式恢復(fù)數(shù)據(jù)庫
使用mysql重定向的方式恢復(fù)指定數(shù)據(jù)庫文件;
mysql -uroot -p111 -e "drop database gzy;"
###使用mysql重定向的方式恢復(fù)指定數(shù)據(jù)庫文件
mysql -uroot -p111 < /opt/backup/gzy.sql
mysql -uroot -p111 -e "show databases;"
3.2.2 管道符方式恢復(fù)數(shù)據(jù)庫
使用mysql+管道符的方式恢復(fù)指定數(shù)據(jù)庫文件;
mysql -uroot -p111 -e "drop database gzy;"
cat /opt/backup/gzy.sql | mysql -uroot -p111
mysql -uroot -p111 -e "show databases;"
免交互方式,使用指定數(shù)據(jù)庫中的數(shù)據(jù)表文件恢復(fù);
mysql -uroot -p111 -e "drop database gzy;"
mysql -uroot -p111 -e "show databases;"
mysql -uroot -p111 < /opt/backup/gzy_clr.sql
###將已備份好的數(shù)據(jù)文件恢復(fù)到指定數(shù)據(jù)庫kgc中
mysql -uroot -p111 kgc < /opt/backup/gzy_clr.sql
mysql -uroot -p111 -e "select * from kgc.clr;"
3.3 恢復(fù)表操作
舉例:shell腳本定時自動執(zhí)行腳本備份操作
###每周二的凌晨十二點半,定時自動執(zhí)行腳本備份所有的數(shù)據(jù)庫文件數(shù)據(jù)
30 0 * * 2 xxx/mysqldump-uxx -pxxx --all-databases > /opt/backup/XXX.sql
3.4 完全恢復(fù)數(shù)據(jù)庫總結(jié)
完全恢復(fù)
先登錄到mysql,再執(zhí)行 source XXX.sql(注:如果XXX.sql是表數(shù)據(jù)文件那么需要先自行創(chuàng)建庫并use切換庫)
mysql -uXXX -pXXX [庫名] < XXX.sql
cat XXX.sql | mysql -uXXX -pXXX [庫名]
4.MySQL增量備份與恢復(fù)
4.1 二進制日志文件
mysql -uroot -p111
###模糊查詢通用日志的相關(guān)信息
show variables like 'general%';
###模糊查詢二進制日志的相關(guān)信息
show variables like 'log_bin%';
###模糊查詢慢查詢?nèi)罩镜南嚓P(guān)信息
show variables like '%slow%';
vim /etc/my.cnf
------------在“server-id”行下面添加mysql數(shù)據(jù)庫的日志信息---------
server-id = 1
---------------------------------------------------------------
#錯誤日志
log-error=/usr/local/mysql/data/mysql_error.log
#通用查詢?nèi)罩?/span>
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log
#二進制日志
log-bin=mysql-bin
#慢查詢?nèi)罩?/span>
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
long_query_time=2
systemctl restart mysqld
mysql -uroot -p111
刷新生成二進制日志文件的兩種方式:
(1)重啟數(shù)據(jù)庫服務(wù):systemctl restart mysqld;
(2)flush-logs命令刷新:mysqladmin -uroot -p111 flush-logs;
注意:
新刷新出來的數(shù)據(jù)日志文件,實際是個空文件,因此應(yīng)該備份保存的是新刷新出來的前一個序列號的日志文件。
二進制日志(binlog)有3種不同的記錄格式:
- STATEMENT(基于SQL語句):默認格式是STATEMENT。該方式記錄語句快,占用內(nèi)存空間少。但高并發(fā)情況下會導(dǎo)致記錄日志順序紊亂,造成恢復(fù)數(shù)據(jù)時發(fā)生偏差。
- ROW(基于行):基于數(shù)據(jù)內(nèi)容行進行記錄,不僅記錄執(zhí)行的命令語句,還會記錄命令影響的相關(guān)數(shù)據(jù)行。
- MIXED(混合模式):高并發(fā)情況下ROW方式進行記錄,一般情況下采用STATEMENT方式進行記錄。
vim /etc/my.cnf
#錯誤日志
log-error=/usr/local/mysql/data/mysql_error.log
#通用查詢?nèi)罩?/span>
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log
#二進制日志
log-bin=mysql-bin
#可選,指定二進制日志(binlog)的記錄格式為ROW
binlog_format = ROW
#慢查詢?nèi)罩?/span>
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
long_query_time=2
systemctl restart mysqld
###轉(zhuǎn)換格式,查看指定序列號的二進制數(shù)據(jù)日志文件
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000003
--no-defaults:不使用默認格式進行查看
--base64-output=decode-rows:使用base64密碼格式進行轉(zhuǎn)換,-rows:按行進行輸出
-v:顯示詳細輸出過程
###修改更新數(shù)據(jù)庫文件,可以在新生成的二進制日志數(shù)據(jù)文件中查看到更新的數(shù)據(jù)內(nèi)容
mysql -uroot -p111
use gzy;
update clr set name='xiaoxiao' where id=2;
systemctl restart mysqld
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000005
4.2 實例:完全備份+增量備份恢復(fù)數(shù)據(jù)庫
mkdir /opt/bak
cd /opt/bak/
###full文件用于保存完全備份的數(shù)據(jù)文件,add用于保存增量備份的數(shù)據(jù)文件
mkdir full add
mysql -uroot -p111
###創(chuàng)建benet數(shù)據(jù)庫
create database benet;
use benet;
create table t1 (id int,name varchar(20),age int,hobby varchar(50));
insert into t1 values (1,'小狗',22,'吃魚');
insert into t1 values (2,'小豬',29,'吃牛');
insert into t1 values (3,'小貓',20,'畫虎');
###采用完全備份的方式備份benet數(shù)據(jù)庫中的所有內(nèi)容
mysqldump -uroot -p111 --databases benet > /opt/bak/full/benet-$(date +%F).sql
###刷新權(quán)限,采用增量方式備份benet數(shù)據(jù)庫中的所有內(nèi)容
mysqladmin -uroot -p111 flush-logs
cd /usr/local/mysql/data
mv /usr/local/mysql/data/mysql-bin.000001 /opt/bak/add/mysql-bin-$(date +%F).sql
###新的一天增加新的數(shù)據(jù)內(nèi)容,并進行增量備份新增加的數(shù)據(jù)內(nèi)容
insert into t1 values (4,'小熊',22,'爬山');
insert into t1 values (5,'小馬',25,'跑步');
###增量備份新生成的數(shù)據(jù)文件
mysqladmin -uroot -p111 flush-logs
mv /usr/local/mysql/data/mysql-bin.000002 /opt/bak/add/mysql-bin-$(date -d "1 day" +%F).sql
###新的一天增加新的數(shù)據(jù)內(nèi)容,并進行增量備份新增加的數(shù)據(jù)內(nèi)容
insert into t1 values (6,'小驢',22,'走路');
insert into t1 values (7,'小雞',23,'唱歌');
###增量備份新生成的數(shù)據(jù)文件
mysqladmin -uroot -p111 flush-logs
mv /usr/local/mysql/data/mysql-bin.000003 /opt/bak/add/mysql-bin-$(date -d "2 day" +%F).sql
###刪除提前已經(jīng)備份好的數(shù)據(jù)庫benet
drop database benet;
完全備份+增量備份的具體恢復(fù)步驟:
###先采用完全備份的方式恢復(fù)benet數(shù)據(jù)庫的文件內(nèi)容
cd /opt/bak/full
cat benet-2023-06-19.sql | mysql -uroot -p111
mysql -uroot -p111 -e "show databases;"
mysql -uroot -p111 -e "select * from benet.t1;"
###恢復(fù)第二天增量備份到的數(shù)據(jù)內(nèi)容
cd /opt/bak/add
mysqlbinlog --no-defaults mysql-bin-2023-06-20.sql | mysql -uroot -p111
mysql -uroot -p111 -e "select * from benet.t1;"
###恢復(fù)第三天增量備份到的數(shù)據(jù)內(nèi)容
mysqlbinlog --no-defaults mysql-bin-2023-06-21.sql | mysql -uroot -p111
mysql -uroot -p111 -e "select * from benet.t1;"
4.3 斷點恢復(fù)
mysql -uroot -p111
use benet;
select * from t1;
delete from t1 where id=6 or id=7;
###轉(zhuǎn)換二進制日志文件格式,將已備份文件重定向?qū)懭氲?txt文件中
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin-2023-06-21.sql > mysql-bin-2023-06-21.txt
4.3.1 基于位置恢復(fù)
–start-position:從某個位置開始恢復(fù)備份文件,直到備份文件結(jié)尾結(jié)束
delete from t1 where id=6 or id=7;
###--start-position從某個位置開始往后恢復(fù)備份文件,直到結(jié)尾備份結(jié)束
mysqlbinlog --no-defaults --start-position='572' mysql-bin-2023-06-21.sql | mysql -uroot -p111
–stop-position:從開頭開始恢復(fù)備份文件,直到某個指定位置備份恢復(fù)結(jié)束
delete from t1 where id=6 or id=7;
###--stop-position從開頭開始恢復(fù)備份文件,直到某個指定位置結(jié)束
mysqlbinlog --no-defaults --stop-position='572' mysql-bin-2023-06-21.sql | mysql -uroot -p111
4.3.2 基于時間點恢復(fù)
–stop-datetime:從開頭開始恢復(fù)備份文件,直到某個指定時間節(jié)點備份結(jié)束
delete from t1 where id=6 or id=7;
###--stop-datetime從開頭開始恢復(fù)備份文件,直到某個指定時間節(jié)點備份結(jié)束
mysqlbinlog --no-defaults --stop-datetime='2023-06-19 21:37:08' mysql-bin-2023-06-21.sql | mysql -uroot -p111
–start-datetime:從指定時間節(jié)點開始恢復(fù)備份文件,直到結(jié)尾備份結(jié)束
delete from t1 where id=6 or id=7;
###--start-datetime從指定時間節(jié)點開始恢復(fù)備份文件,直到結(jié)尾備份結(jié)束
mysqlbinlog --no-defaults --start-datetime='2023-06-19 21:37:08' mysql-bin-2023-06-21.sql | mysql -uroot -p111
4.4 增量備份總結(jié)
查看二進制日志文件
mysqlbinlog --no-defaults --base64-output=decode-rows -v 二進制日志文件
刷新二進制日志
mysqladmin -uXXX -pXXX flush-logs
使用二進制日志實現(xiàn)增量恢復(fù)文章來源:http://www.zghlxwxcb.cn/news/detail-500743.html
mysqlbinlog --no-defaults 二進制日志文件 | mysql -uXXX -pXXX
斷點恢復(fù)文章來源地址http://www.zghlxwxcb.cn/news/detail-500743.html
mysqlbinlog --no-defaults --start-position="位置點" --stop-position="位置點" 二進制日志文件 | mysql -uXXX -pXXX
mysqlbinlog --no-defaults --start-datetime="YYYY-mm-dd HH:MM:SS" --stop-datetime="YYYY-mm-dd HH:MM:SS" 二進制日志文件 | mysql -uXXX -pXXX
- 如果需要恢復(fù)到某條SQL語句之前的所有數(shù)據(jù),就stop在這個語句的位置點或時間點;
- 如果需要恢復(fù)某條SQL語句之后的所有數(shù)據(jù),就從這個語句的位置點或時間點start。
到了這里,關(guān)于【數(shù)據(jù)庫四】MySQL備份與恢復(fù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!