MySQL中數(shù)據(jù)庫(kù)備份恢復(fù)的常用方法詳解
一、數(shù)據(jù)庫(kù)備份的分類(lèi)
1.1 數(shù)據(jù)備份的重要性
- 在生產(chǎn)環(huán)境中,數(shù)據(jù)的安全性至關(guān)重要
- 任何數(shù)據(jù)的丟失都可能產(chǎn)生嚴(yán)重的后果
- 造成數(shù)據(jù)丟失的原因
- 程序錯(cuò)誤
- 人為操作錯(cuò)誤
- 運(yùn)算錯(cuò)誤
- 磁盤(pán)故障
- 災(zāi)難(如火災(zāi)、地震)和盜竊
1.2 數(shù)據(jù)庫(kù)備份的分類(lèi)
從物理與邏輯的角度,備份可分為
- 物理備份:對(duì)數(shù)據(jù)庫(kù)操作系統(tǒng)的物理文件(如數(shù)據(jù)文件、日志文件等)的備份
- 邏輯備份:對(duì)數(shù)據(jù)庫(kù)邏輯組件(如:表等數(shù)據(jù)庫(kù)對(duì)象)的備份
物理備份方法
- 冷備份(脫機(jī)備份) :是在關(guān)閉數(shù)據(jù)庫(kù)的時(shí)候進(jìn)行的
- 熱備份(聯(lián)機(jī)備份) :數(shù)據(jù)庫(kù)處于運(yùn)行狀態(tài),依賴于數(shù)據(jù)庫(kù)的日志文件
- 溫備份:數(shù)據(jù)庫(kù)鎖定表格(不可寫(xiě)入但可讀)的狀態(tài)下進(jìn)行備份操作
從數(shù)據(jù)庫(kù)的備份策略角度,備份可分為
- 完全備份:每次對(duì)數(shù)據(jù)庫(kù)進(jìn)行完整的備份
- 差異備份:備份自從上次完全備份之后被修改過(guò)的文件
- 增量備份:只有在上次完全備份或者增量備份后被修改的文件才會(huì)被備份
1.3 常見(jiàn)的備份方法
物理冷備
- 備份時(shí)數(shù)據(jù)庫(kù)處于關(guān)閉狀態(tài),直接打包數(shù)據(jù)庫(kù)文件
- 備份速度快,恢復(fù)時(shí)也是最簡(jiǎn)單的
專用備份工具mydump或mysqlhotcopy
- mysqldump常用的邏輯備份工具
- mysqlhotcopy僅擁有備份MyISAM和ARCHIVE表
啟用二進(jìn)制日志進(jìn)行增量備份:進(jìn)行增量備份,需要刷新二進(jìn)制日志
第三方工具備份:免費(fèi)的MySQL熱備份軟件Percona XtraBackup
二、MySQL完全備份
- 是對(duì)整個(gè)數(shù)據(jù)庫(kù)、數(shù)據(jù)庫(kù)結(jié)構(gòu)和文件結(jié)構(gòu)的備份
- 保存的是備份完成時(shí)刻的數(shù)據(jù)庫(kù)
- 是差異備份與增量備份的基礎(chǔ)
優(yōu)點(diǎn)
- 備份與恢復(fù)操作簡(jiǎn)單方便
缺點(diǎn)
- 數(shù)據(jù)存在大量的重復(fù)
- 占用大量的備份空間
- 備份與恢復(fù)時(shí)間長(zhǎng)
2.1 數(shù)據(jù)庫(kù)完全備份分類(lèi)
物理冷備份與恢復(fù)
- 關(guān)閉MySQL數(shù)據(jù)庫(kù)
- 使用tar命令直接打包數(shù)據(jù)庫(kù)文件夾
- 直接替換現(xiàn)有MySQL目錄即可
mysqldump備份與恢復(fù)
- MySQL自帶的備份工具,可方便實(shí)現(xiàn)對(duì)MySQL的備份
- 可以將指定的庫(kù)、表導(dǎo)出為SQL腳本
- 使用命令mysq|導(dǎo)入備份的數(shù)據(jù)
2.2 MySQL物理冷備份及恢復(fù)
物理冷備份
[root@localhost mysql]# systemctl stop mysqld.service [root@localhost ~]# cd /usr/local/mysql/ [root@localhost mysql]# tar zcvf /opt/mysql_all-$(date +%F).tar.gz data/ [root@localhost mysql]# cd /opt [root@localhost opt]# ls mysql_all-2020-08-18.tar.gz
恢復(fù)數(shù)據(jù)庫(kù)
[root@localhost opt]# cd /usr/local/mysql/ [root@localhost mysql]# rm -rf data/ '刪除數(shù)據(jù)庫(kù)文件' [root@localhost mysql]# mysql -uroot -p mysql> show databases; '此時(shí)數(shù)據(jù)庫(kù)文件消失' +--------------------+ | Database | +--------------------+ | information_schema | +--------------------+ 1 row in set (0.00 sec) [root@localhost mysql]# cd /opt [root@localhost opt]# tar zxvf mysql_all-2020-08-18.tar.gz -C /usr/local/mysql/ '將備份的文件恢復(fù)' [root@localhost mysql]# systemctl start mysqld.service [root@localhost mysql]# mysql -uroot -p mysql> show databases; '數(shù)據(jù)恢復(fù)' +--------------------+ | Database | +--------------------+ | information_schema | | mydatabase | | mysql | | performance_schema | | sys | +--------------------+ 6 rows in set (0.00 sec)
2.3 mysqkdump備份數(shù)據(jù)庫(kù)
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | apple | | mydatabase | | mysql | | performance_schema | | sys | +--------------------+ 6 rows in set (0.00 sec) mysql> use mydatabase; Database changed mysql> show tables; +----------------------+ | Tables_in_mydatabase | +----------------------+ | mytable | +----------------------+ 1 row in set (0.00 sec) mysql> select * from mytable; +----+----------+-------+---------+ | id | name | score | address | +----+----------+-------+---------+ | 1 | zhangsan | 80.00 | sh | | 2 | lisi | 77.00 | nj | +----+----------+-------+---------+ 2 rows in set (0.00 sec)
mysqldump命令對(duì)單個(gè)庫(kù)進(jìn)行完全備份
mysqldump -u用戶名-p [密碼] [選項(xiàng)] [數(shù)據(jù)庫(kù)名] > /備份路徑/備份文件名
[root@localhost ~]# mysqldump -uroot -p123456 mydatabase > /opt/mydatabase.sql mysqldump: [Warning] Using a password on the command line interface can be insecure. [root@localhost opt]# ls mydatabase.sql
mysqldump命令對(duì)多個(gè)庫(kù)進(jìn)行完全備份
mysqldump -u 用戶名 -p [密碼] [選項(xiàng)] --databases 庫(kù)名1 [庫(kù)名2] ... > /備份路徑/備份文件名
[root@localhost ~]# mysqldump -uroot -p123456 --databases mydatabase apple > /opt/mydatabase-apple.sql mysqldump: [Warning] Using a password on the command line interface can be insecure. [root@localhost opt]# ls mydatabase-apple.sql mydatabase.sql
對(duì)所有庫(kù)進(jìn)行完全備份
mysqldump -u 用戶名 -p [密碼] [選項(xiàng)] --all-databases > /備份路徑/備份文件名
[root@localhost ~]# mysqldump -uroot -p123456 --all-databases > /opt/all.sql mysqldump: [Warning] Using a password on the command line interface can be insecure. [root@localhost opt]# ls all.sql mydatabase-apple.sql mydatabase.sql
mysqldump可針對(duì)庫(kù)內(nèi)特定的表進(jìn)行備份
mysqldump -u 用戶名 -p [密碼] [選項(xiàng)] 數(shù)據(jù)庫(kù)名 表名 > /備份路徑/備份文件名
[root@localhost opt]# mysqldump -uroot -p123456 mydatabase mytable > /opt/mydatabase.mytable.sql mysqldump: [Warning] Using a password on the command line interface can be insecure. [root@localhost opt]# ls all.sql mydatabase.sql mydatabase-apple.sql mydatabase.mytable.sql
2.4 恢復(fù)數(shù)據(jù)庫(kù)
使用mysqldump導(dǎo)出的腳本,可使用導(dǎo)入的方法
- source命令,用在mysq|中, 只可以使用絕對(duì)路徑
- mysq|命令,用在linux下面
使用source恢復(fù)數(shù)據(jù)庫(kù)的步驟
- 登錄到MySQL數(shù)據(jù)庫(kù)
- 執(zhí)行source備份sq|腳本的路徑
source恢復(fù)的示例
mysql > source /backup/all-data.sql
mysql> drop table mytable; Query OK, 0 rows affected (0.00 sec) mysql> show tables; Empty set (0.00 sec) mysql> source /opt/mydatabase.sql mysql> show tables; +----------------------+ | Tables_in_mydatabase | +----------------------+ | mytable | +----------------------+ 1 row in set (0.00 sec)
mysql> drop database apple; Query OK, 1 row affected (0.00 sec) mysql> drop database mydatabase; Query OK, 1 row affected (0.01 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec) mysql> source /opt/mydatabase-apple.sql mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | apple | | mydatabase | | mysql | | performance_schema | | sys | +--------------------+ 6 rows in set (0.00 sec)
使用mysql命令恢復(fù)數(shù)據(jù)庫(kù)
mysql -u 用戶名 -p 密碼 < 庫(kù)備份腳本的路徑
例:
[root@localhost opt]# mysql -uroot -p123456 < /opt/mydatabase-apple.sql
恢復(fù)表的操作
- 恢復(fù)表時(shí)同樣可以使用source或者mysql命令
- source恢復(fù)表的操作與恢復(fù)庫(kù)的操作相同
- 當(dāng)備份文件中只包含表的備份,而不包括創(chuàng)建庫(kù)的語(yǔ)句時(shí),必須指定庫(kù)名,且目標(biāo)庫(kù)必須存在
mysql -u 用戶名 -p 密碼 < 表備份腳本的路徑
[root@localhost opt]# mysql -uroot -p123456 < /opt/mydatabase.info.sql
在生產(chǎn)環(huán)境中,可以使用shell腳本自動(dòng)實(shí)現(xiàn)定時(shí)備份
三、MySQL增量備份
使用mysqldump進(jìn)行完全備份存在的問(wèn)題
- 備份數(shù)據(jù)中有重復(fù)數(shù)據(jù)
- 備份時(shí)間與恢復(fù)時(shí)間過(guò)長(zhǎng)
是自上一次備份后增加/變化的文件或者內(nèi)容
特點(diǎn)
- 沒(méi)有重復(fù)數(shù)據(jù),備份量不大,時(shí)間短
- 恢復(fù)需要_上次完全備份及完全備份之后所有的增量備份才能恢復(fù),而且要對(duì)所有增量備份進(jìn)行逐個(gè)反推恢復(fù)
MySQL沒(méi)有提供直接的增量備份方法
可通過(guò)MySQL提供的二進(jìn)制日志間接實(shí)現(xiàn)增量備份
MySQL二進(jìn)制日志對(duì)備份的意義
- 二進(jìn)制日志保存了所有更新或者可能更新數(shù)據(jù)庫(kù)的操作
- 二進(jìn)制日志在啟動(dòng)MySQL服務(wù)器后開(kāi)始記錄,并在文件達(dá)到max_binlog_size所設(shè)置的大小或者接收到flush logs命令后重新創(chuàng)建新的日志文件
- 只需定時(shí)執(zhí)行flush logs方法重新創(chuàng)建新的日志,生成二進(jìn)制文件序列,并及時(shí)把這些日志保存到安全的地方就完成了一個(gè)時(shí)間段的增量備份
[root@localhost opt]# vim /etc/my.cnf ....... [mysqld] user = mysql basedir = /usr/local/mysql datadir=/usr/local/mysql/data port = 3306 character_set_server=utf8 pid-file = /usr/local/mysql/mysqld.pid socket = /usr/local/mysql/mysql.sock log-bin=mysql-bin '添加以mysql-bin為開(kāi)頭的二進(jìn)制文件' server-id = 1 [root@localhost data]# ls apple ibdata1 ibtmp1 mysql-bin.000001 '二進(jìn)制日志文件' auto.cnf ib_logfile0 mydatabase mysql-bin.index ib_buffer_pool ib_logfile1 mysql
3.1 MySQL數(shù)據(jù)庫(kù)增量恢復(fù)
一般恢復(fù):將所有備份的二進(jìn)制日志內(nèi)容全部恢復(fù)
mysqlbinlog [--no-defaults] 增量備份文件 | mysql -u 用戶名 -p
基于位置恢復(fù)
- 數(shù)據(jù)庫(kù)在某一時(shí)間點(diǎn)可能既有錯(cuò)誤的操作也有正確的操作
- 可以基于精準(zhǔn)的位置跳過(guò)錯(cuò)誤的操作
恢復(fù)數(shù)據(jù)到指定位置 mysqlbinlog --stop-position='操作id' 二進(jìn)制日志 |mysql -u 用戶名 -p 密碼 從指定的位置開(kāi)始恢復(fù)數(shù)據(jù) mysqlbinlog --start-position='操作id' 二進(jìn)制日志 |mysql -u 用戶名 -p 密碼
基于時(shí)間點(diǎn)恢復(fù)
跳過(guò)某個(gè)發(fā)生錯(cuò)誤的時(shí)間點(diǎn)實(shí)現(xiàn)數(shù)據(jù)恢復(fù)
從日志開(kāi)頭截止到某個(gè)時(shí)間點(diǎn)的恢復(fù) mysqlbinlog [--no-defaults] --stop-datetime='年-月-日 小時(shí):分鐘:秒' 二進(jìn)制日志 |mysql -u 用戶名 -p 密碼 從某個(gè)時(shí)間點(diǎn)到日志結(jié)尾的恢復(fù) mysqlbinlog [--no-defaults] --start-datetime='年-月-日 小時(shí):分鐘:秒' 二進(jìn)制日志 |mysql -u 用戶名 -p 密碼 從某個(gè)時(shí)間點(diǎn)到某個(gè)時(shí)間點(diǎn)的恢復(fù) mysqlbinlog [--no-defaults] --start-datetime='年-月-日 小時(shí):分鐘:秒' --stop-datetime='年-月-日 小時(shí):分鐘:秒' 二進(jìn)制日志 |mysql -u 用戶名 -p 密碼
3.2 增量備份及恢復(fù)的具體操作
操作前先進(jìn)行完整備份
[root@localhost ~]# mysqldump -uroot -p123456 mydatabase mytable > /opt/mytable.sql
開(kāi)啟日志文件
[root@localhost ~]# vim /etc/my.cnf [mysqld] user = mysql basedir = /usr/local/mysql datadir=/usr/local/mysql/data port = 3306 character_set_server=utf8 pid-file = /usr/local/mysql/mysqld.pid socket = /usr/local/mysql/mysql.sock log-bin=mysql-bin '開(kāi)啟二進(jìn)制日志文件' [root@localhost data]# systemctl restart mysqld.service [root@localhost data]# ls apple ibdata1 ibtmp1 mysql-bin.000001 '二進(jìn)制日志文件' auto.cnf ib_logfile0 mydatabase mysql-bin.index ib_buffer_pool ib_logfile1 mysql
進(jìn)行模擬誤操作
mysql> select * from mytable; +----+----------+-----+ | id | name | age | +----+----------+-----+ | 1 | zhangsan | 22 | | 2 | lisi | 26 | | 3 | wangwu | 30 | +----+----------+-----+ 3 rows in set (0.00 sec) mysql> insert into mytable values (4,'zhaoliu','20'); '執(zhí)行正確操作' Query OK, 1 row affected (0.02 sec) mysql> delete from mytable where id=1; '進(jìn)行誤操作' Query OK, 1 row affected (0.00 sec) mysql> insert into mytable values (5,'qiqi','21'); '執(zhí)行正確操作' Query OK, 1 row affected (0.01 sec) mysql> select * from mytable; +----+---------+-----+ | id | name | age | +----+---------+-----+ | 2 | lisi | 26 | | 3 | wangwu | 30 | | 4 | zhaoliu | 20 | | 5 | qiqi | 21 | +----+---------+-----+ 4 rows in set (0.00 sec)
進(jìn)行增量備份
[root@localhost data]# mysqladmin -uroot -p123456 flush-logs mysqladmin: [Warning] Using a password on the command line interface can be insecure.
解碼二進(jìn)制日志文件
[root@localhost data]# mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000001 > /opt/bk01.txt
[root@localhost data]# vim /opt/bk01.txt # at 584 '正常操作結(jié)束' #200822 15:06:12 server id 1 end_log_pos 646 CRC32 0x591ad99d Table_map: `mydatabase`.`mytable` mapped to number 108 # at 646 '執(zhí)行的誤操作' #200822 15:06:12 server id 1 end_log_pos 698 CRC32 0x4ddb56be Delete_rows: table id 108 flags: STMT_END_F ### DELETE FROM `mydatabase`.`mytable` ### WHERE ### @1=1 ### @2='zhangsan' ### @3='22' # at 698 '正常操作開(kāi)始' #200822 15:06:12 server id 1 end_log_pos 729 CRC32 0x30b1bed7 Xid = 7 COMMIT/*!*/; #200822 15:06:30 server id 1 end_log_pos 794 CRC32 0x576f94b9 Anonymous_GTID last_committed=2 sequence_number=3 SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
先刪除錯(cuò)誤的數(shù)據(jù)表,進(jìn)行恢復(fù)
mysql> drop table mytable; Query OK, 0 rows affected (0.00 sec) mysql> source /opt/mytable.sql; mysql> select * from mytable; +----+----------+-----+ | id | name | age | +----+----------+-----+ | 1 | zhangsan | 22 | | 2 | lisi | 26 | | 3 | wangwu | 30 | +----+----------+-----+ 3 rows in set (0.00 sec)
使用增量備份的斷點(diǎn)恢復(fù)
[root@localhost data]# mysqlbinlog --no-defaults --stop-position='584' /usr/local/mysql/data/mysql-bin.000001 | mysql -uroot -p123456 mysql: [Warning] Using a password on the command line interface can be insecure. mysql> select * from mytable; +----+----------+-----+ | id | name | age | +----+----------+-----+ | 1 | zhangsan | 22 | | 2 | lisi | 26 | | 3 | wangwu | 30 | | 4 | zhaoliu | 20 | +----+----------+-----+ 4 rows in set (0.00 sec) [root@localhost data]# mysqlbinlog --no-defaults --start-position='698' /usr/local/mysql/data/mysql-bin.000001 | mysql -uroot -p123456 mysql: [Warning] Using a password on the command line interface can be insecure. mysql> select * from mytable; +----+----------+-----+ | id | name | age | +----+----------+-----+ | 1 | zhangsan | 22 | | 2 | lisi | 26 | | 3 | wangwu | 30 | | 4 | zhaoliu | 20 | | 5 | qiqi | 21 | +----+----------+-----+ 5 rows in set (0.00 sec)
按照增量備份中的時(shí)間點(diǎn)恢復(fù)
mysql> drop table mytable; Query OK, 0 rows affected (0.00 sec) mysql> source /opt/mytable.sql; mysql> select * from mytable; +----+----------+-----+ | id | name | age | +----+----------+-----+ | 1 | zhangsan | 22 | | 2 | lisi | 26 | | 3 | wangwu | 30 | +----+----------+-----+ 3 rows in set (0.00 sec)
[root@localhost data]# mysqlbinlog --no-defaults --stop-datetime='2020-8-22 15:06:12' /usr/local/mysql/data/mysql-bin.000001 | mysql -uroot -p123456 mysql: [Warning] Using a password on the command line interface can be insecure. mysql> select * from mytable; +----+----------+-----+ | id | name | age | +----+----------+-----+ | 1 | zhangsan | 22 | | 2 | lisi | 26 | | 3 | wangwu | 30 | | 4 | zhaoliu | 20 | +----+----------+-----+ 4 rows in set (0.00 sec) [root@localhost data]# mysqlbinlog --no-defaults --start-datetime='2020-8-22 15:06:30' /usr/local/mysql/data/mysql-bin.000001 | mysql -uroot -p123456 mysql: [Warning] Using a password on the command line interface can be insecure. mysql> select * from mytable; +----+----------+-----+ | id | name | age | +----+----------+-----+ | 1 | zhangsan | 22 | | 2 | lisi | 26 | | 3 | wangwu | 30 | | 4 | zhaoliu | 20 | | 5 | qiqi | 21 | +----+----------+-----+ 5 rows in set (0.00 sec)
以上就是MySQL中數(shù)據(jù)庫(kù)備份恢復(fù)的常用方法詳解的詳細(xì)內(nèi)容,更多關(guān)于MySQL數(shù)據(jù)庫(kù)備份恢復(fù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Mysql根據(jù)某層部門(mén)ID查詢所有下級(jí)多層子部門(mén)的示例
這篇文章主要介紹了Mysql根據(jù)某層部門(mén)ID查詢所有下級(jí)多層子部門(mén)的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
MySQL 常見(jiàn)存儲(chǔ)引擎的優(yōu)劣
眾所周知,MySql 提供了很多存儲(chǔ)引擎,這里來(lái)比較一下常見(jiàn)引擎的優(yōu)劣。幫助大家選擇合適的存儲(chǔ)引擎2021-06-06
MySQL系列教程小白數(shù)據(jù)庫(kù)基礎(chǔ)
這篇文章主要為大家介紹了MySQL系列中的數(shù)據(jù)庫(kù)基礎(chǔ),非常適合數(shù)據(jù)庫(kù)小白的入門(mén)基礎(chǔ)篇,詳細(xì)的講解了數(shù)據(jù)庫(kù)的基本概念以及基礎(chǔ)命令及操作示例,有需要的朋友可以借鑒參考下2021-10-10
MySQL 外鍵約束和表關(guān)系相關(guān)總結(jié)
一個(gè)項(xiàng)目中如果將所有的數(shù)據(jù)都存放在一張表中是不合理的,比如一個(gè)員工信息,公司只有2個(gè)部門(mén),但是員工有1億人,就意味著員工信息這張表中的部門(mén)字段的值需要重復(fù)存儲(chǔ),極大的浪費(fèi)資源,因此可以定義一個(gè)部門(mén)表和員工信息表進(jìn)行關(guān)聯(lián),而關(guān)聯(lián)的方式就是外鍵。2021-06-06
linux系統(tǒng)中使用openssl實(shí)現(xiàn)mysql主從復(fù)制
在MySQL的主從復(fù)制中,其傳輸過(guò)程是明文傳輸,并不能保證數(shù)據(jù)的安全性,今天我們就來(lái)討論下linux系統(tǒng)中使用openssl實(shí)現(xiàn)mysql主從復(fù)制,有需要的小伙伴可以參考下2016-11-11

