linux之MySQL的數(shù)據(jù)備份和恢復(fù)實(shí)現(xiàn)方式
?防止由于機(jī)械故障以及人為誤操作帶來的數(shù)據(jù)丟失,例如將數(shù)據(jù)庫文件保存在了其它地方。
備份方式
從生成備份的內(nèi)容區(qū)分
物理備份
?直接復(fù)制數(shù)據(jù)庫文件,適用于大型數(shù)據(jù)庫環(huán)境,不受存儲引擎的限制,但不能恢復(fù)到不同的MySQL版本。
物理備份的備份方式
完全備份
- 每次對數(shù)據(jù)進(jìn)行完整的備份,保存的是當(dāng)前數(shù)據(jù)庫中所有的數(shù)據(jù),是差異備份與增量備份的基礎(chǔ)。
- 優(yōu)點(diǎn):備份與恢復(fù)操作簡單方便,恢復(fù)時(shí)一次恢復(fù)到位,恢復(fù)速度快
- 缺點(diǎn):占用空間大,備份速度慢
增量備份
- 每次備份上一次備份到現(xiàn)在產(chǎn)生的新數(shù)據(jù)
- 特點(diǎn):因而備份的數(shù)據(jù)量小,占用空間小,備份速度快。
- 但恢復(fù)時(shí),需要從上一次的完整備份起按備份時(shí)間順序,逐個(gè)備份版本進(jìn)行恢復(fù),恢復(fù)時(shí)間長,如中間某次的備份數(shù)據(jù)損壞,將導(dǎo)致數(shù)據(jù)的丟失。
差異備份
- 只備份跟完整備份不一樣的
- 特點(diǎn):差異備份其實(shí)就是增量備份的中特殊操作,它體現(xiàn)在差異備份只能以一個(gè)完整備份為基礎(chǔ),占用空間比增量備份大,比完整備份小,恢復(fù)時(shí)僅需要恢復(fù)第一個(gè)完整版本和最后一次的差異版本,恢復(fù)速度介于完整備份和增量備份之間。
邏輯備份
- 備份的是建表、建庫、插入等操作所執(zhí)行SQL語句(DDL DML DCL),
- 適用于中小型數(shù)據(jù)庫,效率相對較低。?
總結(jié):
| 物理備份 | 邏輯備份 | |
|---|---|---|
| 備份方式 | 備份數(shù)據(jù)庫數(shù)據(jù) | 備份數(shù)據(jù)庫建表、建庫、插入sql語句 |
| 優(yōu)點(diǎn) | 恢復(fù)速度比較快 | 備份文件相對較小,只備份表中的數(shù)據(jù)與結(jié)構(gòu) |
| 缺點(diǎn) | 備份文件相對較大(備份表空間,包含數(shù)據(jù)與索引) | 恢復(fù)速度較慢(需要重建索引,存儲過程等) |
| 對業(yè)務(wù)影響 | I/O負(fù)載加大 | I/O負(fù)載加大 |
| 代表工具 | ibbackup、xtrabackup開源,mysqlbackup | mysqldump |
?工作中使用需要使用哪種需要根據(jù)業(yè)務(wù)和數(shù)據(jù)量來決定,一般情況下,數(shù)據(jù)量特別巨大時(shí)會采用物理備份,數(shù)據(jù)量中小時(shí)采取邏輯備份
從恢復(fù)數(shù)據(jù)操作區(qū)分
冷備份
?恢復(fù)備份時(shí),其他人禁止訪問數(shù)據(jù)庫
溫備份
?恢復(fù)備份時(shí),其他人可對數(shù)據(jù)庫進(jìn)行查詢
熱備份
?恢復(fù)數(shù)據(jù)時(shí),其他人可對數(shù)據(jù)庫進(jìn)行所有操作
總結(jié):
- 工作中使用什么方式恢復(fù)數(shù)據(jù)是由業(yè)務(wù)決定的,當(dāng)恢復(fù)的業(yè)務(wù)非常重要需要使用冷備份,
- 當(dāng)恢復(fù)的業(yè)務(wù)相對不重要選擇溫備份或熱備份
比如:
- 銀行ATM程序恢復(fù)選擇冷備份
- 圖書館資料管理程序選擇熱備份
第一個(gè)備份——select into
sql中的一個(gè)基礎(chǔ)命令,可以完成數(shù)據(jù)備份,但是由于十分簡陋,只能適用于臨時(shí)的數(shù)據(jù)備份
準(zhǔn)備數(shù)據(jù)
mysql> create database back; #創(chuàng)建back數(shù)據(jù)庫 mysql> use back; #切換到back mysql> create table t_user(id int primary key,name varchar(20)); #創(chuàng)建t_user表 mysql> insert into t_user values(1,'zhangsan'); #添加數(shù)據(jù) mysql> insert into t_user values(2,'lisi'); mysql> insert into t_user values(3,'wangwu');

進(jìn)行備份
#語法 select 語句 into outfile '目標(biāo)文件' mysql> select * from t_user into outfile '/tmp/user.txt' #將select的查詢結(jié)果數(shù)據(jù)儲存到/tmp/user.txt

賦予權(quán)限
?當(dāng)報(bào)錯如上時(shí),表示msyql沒有使用select into 備份權(quán)限
查看當(dāng)前權(quán)限
mysql> show variables like '%secure%';

進(jìn)入/etc/my.cnf

修改配置

secure-file-priv=/tmp
然后重啟mysql,查看信息

重新執(zhí)行命令,并查看備份文件


刪除數(shù)據(jù)

恢復(fù)數(shù)據(jù)
load data infile '/tmp/user.txt' into table t_user;
查詢數(shù)據(jù)

物理備份工具-Xtrabackup
Xtrabackup是開源免費(fèi)的支持MySQL 數(shù)據(jù)庫熱備份的軟件,在 Xtrabackup 包中主要有 Xtrabackup 和 innobackupex 兩個(gè)工具。
其中 Xtrabackup 只能備份 InnoDB 和 XtraDB 兩種引擎; innobackupex則是封裝了Xtrabackup,同時(shí)增加了備份MyISAM引擎的功能。
安裝Xtrabackup
下載并解壓
[root@localhost tmp]# wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.9/binary/redhat/6/x86_64/Percona-XtraBackup-2.4.9-ra467167cdd4-el6-x86_64-bundle.tar [root@localhost tmp]# tar xvf Percona-XtraBackup-2.4.9-ra467167cdd4-el6-x86_64-bundle.tar

安裝
[root@localhost tmp]# yum install -y percona-xtrabackup-24-2.4.9-1.el6.x86\_64.rpm
完整備份
創(chuàng)建備份
創(chuàng)建備份目錄 [root@mysql-server ~]# mkdir /xtrabackup/full -p 執(zhí)行備份命令,將當(dāng)前mysql所有數(shù)據(jù)進(jìn)行備份 [root@mysql-server ~]# innobackupex --user=root --password='411528' -S /tmp/mysql.sock /xtrabackup/full --user: 數(shù)據(jù)庫登陸用戶名 --password: 密碼 -S :數(shù)據(jù)庫套接文件地址,在/etc/my.cnf的socket中獲取


恢復(fù)備份
1.關(guān)閉數(shù)據(jù)庫 2.刪除數(shù)據(jù)庫所有數(shù)據(jù),在/etc/my.cnf中的datadir獲取儲存位置 #注意一旦刪除所有數(shù)據(jù),mysql數(shù)據(jù)庫就理論上被損壞了,無法再啟動,必須恢復(fù)數(shù)據(jù)后才能使用 [root@mysql-server ~]# rm -rf /opt/liuyh/data/mysql/* 3.重演數(shù)據(jù),也就是在恢復(fù)數(shù)據(jù)之前先檢查一下備份文件中是否有問題 [root@mysql-server ~]# innobackupex --apply-log /xtrabackup/full/2021-11-17_00-37-48 4.恢復(fù)數(shù)據(jù) [root@mysql-server ~]# innobackupex --copy-back /xtrabackup/full/2021-11-17_00-37-48 5.數(shù)據(jù)恢復(fù)后,到mysql指定的數(shù)據(jù)儲存位置查看是否有數(shù)據(jù)文件 6.設(shè)置權(quán)限,注意恢復(fù)后的文件需要將權(quán)限設(shè)置為mysql數(shù)據(jù)庫的擁有者可執(zhí)行權(quán)限 [root@mysql-server ~]#chown -R mysql:mysql /opt/liuyh/data/mysql/* 7.啟動數(shù)據(jù)庫,查看數(shù)據(jù)
增量備份
創(chuàng)建備份
1.先創(chuàng)建完整備份 2.修改數(shù)據(jù)庫數(shù)據(jù) 3.創(chuàng)建增量備份 [root@mysql-server ~]# innobackupex --user=root --password=111111 -S /tmp/mysql.sock --incremental /xtrabackup/full --incremental-basedir=/xtrabackup/full/2023-11-17_15-57-12 --incremental:指定增量備份生成位置 --incremental-basedir:指定以哪個(gè)備份為基礎(chǔ)做增量備份,注意:所選備份應(yīng)為一個(gè)完整備份或增量備份

恢復(fù)備份
1.關(guān)閉數(shù)據(jù)庫 2.刪除數(shù)據(jù)庫所有數(shù)據(jù),在/etc/my.cnf中的datadir獲取儲存位置 #注意一旦刪除所有數(shù)據(jù),mysql數(shù)據(jù)庫就理論上被損壞了,無法再啟動,必須恢復(fù)數(shù)據(jù)后才能使用 [root@mysql-server ~]# rm -rf /opt/liuyh/data/mysql/* 3.重演數(shù)據(jù),并整合數(shù)據(jù) #重演完整備份 [root@mysql-server ~]# innobackupex --apply-log --redo-only /xtrabackup/full/2021-11-17_15-57-12 #按生成順序?qū)⒌谝粋€(gè)增量備份整合到完整備份中 [root@mysql-server ~]# innobackupex --apply-log --redo-only /xtrabackup/full/2021-11-17_15-57-12 --incremental-dir=/xtrabackup/full/2021-11-17_16-01-25 #按生成順序?qū)⒌诙€(gè)增量備份整合到完整備份中 [root@mysql-server ~]# innobackupex --apply-log --redo-only /xtrabackup/full/2021-11-17_15-57-12 --incremental-dir=/xtrabackup/full/2021-11-17_16-02-01 4.恢復(fù)數(shù)據(jù),此時(shí)所有數(shù)據(jù)都已經(jīng)保存在完整備份中,只需恢復(fù)完整備份即可 [root@mysql-server ~]# innobackupex --copy-back /xtrabackup/full/2021-11-17_15-57-12 5.設(shè)置權(quán)限,注意恢復(fù)后的文件需要將權(quán)限設(shè)置為mysql數(shù)據(jù)庫的擁有者可執(zhí)行權(quán)限 [root@mysql-server ~]#chown -R mysql:mysql /opt/liuyh/data/mysql/* 6.啟動數(shù)據(jù)庫,查看數(shù)據(jù)
差異備份
?在上面我們已經(jīng)知道差異備份其實(shí)就是增量備份的一種,它的操作與增量備份一致,區(qū)別在于生成差異備份時(shí)只能以一個(gè)完整備份為基礎(chǔ)
邏輯備份工具-mysqldump
mysqldump 是 MySQL 自帶的邏輯備份工具??梢员WC數(shù)據(jù)的一致性和服務(wù)的可用性。
本身為客戶端工具: 遠(yuǎn)程備份語法: # mysqldump -h 服務(wù)器 -u用戶名 -p密碼 數(shù)據(jù)庫名 > 備份文件.sql 本地備份語法: # mysqldump -u用戶名 -p密碼 數(shù)據(jù)庫名 > 備份文件.sql
常用關(guān)鍵字
-A, --all-databases #備份所有庫 -B, --databases #備份多個(gè)數(shù)據(jù)庫 -F, --flush-logs #備份之前刷新binlog日志 --default-character-set #指定導(dǎo)出數(shù)據(jù)時(shí)采用何種字符集,如果數(shù)據(jù)表不是采用默認(rèn)的latin1字符集的話,那么導(dǎo)出時(shí)必須指定該選項(xiàng),否則再次導(dǎo)入數(shù)據(jù)后將產(chǎn)生亂碼問題。 --no-data,-d #不導(dǎo)出任何數(shù)據(jù),只導(dǎo)出數(shù)據(jù)庫表結(jié)構(gòu)。 --lock-tables #備份前,鎖定所有數(shù)據(jù)庫表 --single-transaction #保證數(shù)據(jù)的一致性和服務(wù)的可用性 -f, --force #即使在一個(gè)表導(dǎo)出期間得到一個(gè)SQL錯誤,繼續(xù)。 著重強(qiáng)調(diào): 使用 mysqldump 備份數(shù)據(jù)庫時(shí)避免鎖表: 對一個(gè)正在運(yùn)行的數(shù)據(jù)庫進(jìn)行備份請慎重,盡量不要在數(shù)據(jù)庫開放服務(wù)時(shí)備份,如果一定要在服務(wù)運(yùn)行期間備份,可以選擇添加 --single-transaction選項(xiàng), 類似執(zhí)行: mysqldump --single-transaction -u root -p123456 dbname > mysql.sql
備份所有數(shù)據(jù)
1.創(chuàng)建備份目錄 [root@mysql-server ~]# mkdir /tmp/mysqldumpdata 2.備份當(dāng)前數(shù)據(jù)庫所有數(shù)據(jù) [root@mysql-server ~]# mysqldump -uroot -p111111 -A > /tmp/mysqldumpdata/all.sql 3.查看是否生成文件

恢復(fù)所有數(shù)據(jù)
[root@localhost mysqldumpdata]# mysql -uroot -p111111 < /tmp/mysqldumpdata/all.sql 注意mysqldump只能恢復(fù)表級內(nèi)容,不能恢復(fù)庫,所以當(dāng)數(shù)據(jù)庫失蹤時(shí)需要先手動創(chuàng)建數(shù)據(jù)庫再執(zhí)行恢復(fù)命令
備份和恢復(fù)指定庫內(nèi)容
備份指定庫 [root@mysql-server ~]# mysqldump -uroot -p111111 -B back > /tmp/mysqldumpdata/back.sql -B:指定數(shù)據(jù)庫,多個(gè)庫之間用空格區(qū)分 恢復(fù)指定庫 [root@mysql-server ~]# mysql -uroot -p111111 -B mysql </tmp/mysqldumpdata/mysql.sql 注意:恢復(fù)時(shí)只能指定一個(gè)庫操作,若有多個(gè)則多次執(zhí)行
備份和恢復(fù)指定表內(nèi)容
備份指定表 [root@mysql-server ~]# mysqldump -uroot -p111111 -B back --tables t_user > /tmp/mysqldumpdata/back.sql /opt/yt/mysql/bin/mysqldump --tables:指定表 恢復(fù)指定表 [root@mysql-server ~]# mysql -uroot -p111111 -B back </tmp/mysqldumpdata/user.sql
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
mysql聯(lián)合索引最左匹配原則的底層實(shí)現(xiàn)原理解讀
這篇文章主要介紹了mysql聯(lián)合索引最左匹配原則的底層實(shí)現(xiàn)原理,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09
淺析一個(gè)MYSQL語法(在查詢中使用count)的兼容性問題
本篇文章是對MYSQL語法(在查詢中使用count)的兼容性問題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-07-07
MySql?字符集不同導(dǎo)致?left?join?慢查詢的問題解決
當(dāng)兩個(gè)表的字符集不一樣,在使用字符型字段進(jìn)行表連接查詢時(shí),就需要特別注意下查詢耗時(shí)是否符合預(yù)期,本文主要介紹了MySql?字符集不同導(dǎo)致?left?join?慢查詢的問題解決,感興趣的可以了解一下2024-05-05
Mysql的longblob字段插入數(shù)據(jù)問題解決
在使用mysql的過程中,有個(gè)問題就是mysql的優(yōu)化,mysql中l(wèi)ongblob字段在5.5版本中默認(rèn)的為1M,需要解決問題的朋友可以參考下2014-01-01
MySQL安裝出現(xiàn)starting the server報(bào)錯的解決方案
如果電腦是第一次安裝MySQL,一般不會出現(xiàn)這樣的報(bào)錯,如下圖所示,本文主要介紹了MySQL安裝出現(xiàn)starting the server報(bào)錯的解決方案,感興趣的可以了解一下2024-07-07
MySQL:explain結(jié)果中Extra:Impossible?WHERE?noticed?after?rea
這篇文章主要介紹了MySQL:explain結(jié)果中Extra:Impossible?WHERE?noticed?after?reading?const?tables問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12
mysql函數(shù)日期和時(shí)間函數(shù)匯總
這篇文章主要介紹了mysql函數(shù)日期和時(shí)間函數(shù)匯總,日期和時(shí)間函數(shù)主要用來處理日期和時(shí)間值,一般的日期函數(shù)除了使用??date???類型的參數(shù)外,也可以使用??datetime???或者??timestamp??類型的參數(shù),但會忽略這些值的時(shí)間部分2022-07-07

