MySQL备份与恢复-mysqldump备份与恢复
這片博文主要用來(lái)介紹MySQL的備份與恢復(fù):
MySQL的備份形式可以分為如下幾種:
- 熱備----即不停機(jī)備份
- 冷備----需要關(guān)閉MySQL,然后備份其數(shù)據(jù)文件。(停機(jī)備份一般是直接拷貝其datadir目錄)
- 溫備----在線備份,對(duì)應(yīng)用影響大,通常加一個(gè)讀鎖【會(huì)阻塞寫的應(yīng)用】,意義不大,基本不用。
從導(dǎo)出的備份文件結(jié)構(gòu)可分為如下幾種:
- 邏輯備份---備份的數(shù)據(jù)是導(dǎo)出的SQL語(yǔ)句(如mysqldump, mysqlpump【MySQL5.7加入的】,mydumper)
- 物理備份--備份的是物理文件(如xtracebackup)
接下來(lái)會(huì)詳細(xì)介紹這四種命令的通常用法(如果不特別說(shuō)明,數(shù)據(jù)庫(kù)存儲(chǔ)引擎為INNODB):
mysqldump備份與恢復(fù)
mysqldump的用法如下:
[root@test3 ~]# mysqldump Usage: mysqldump [OPTIONS] database [tables] #備份單個(gè)庫(kù) OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...] #備份多個(gè)庫(kù) OR mysqldump [OPTIONS] --all-databases [OPTIONS] #備份所有的數(shù)據(jù)庫(kù)#可以使用mysqldump --help查看mysqldump的更多參數(shù),會(huì)在下面使用的時(shí)候介紹到經(jīng)常用的參數(shù)。
備份單張表:
[root@test3 ~]# mysqldump -uroot -p123456 --single-transaction employees departments > dep.sql#備份INNODB存儲(chǔ)引擎時(shí)建議加上參數(shù)--single-transaction【實(shí)際上是必須加】,這樣會(huì)保證數(shù)據(jù)的一致性。
查看一下備份出來(lái)的數(shù)據(jù):
[root@test3 ~]# cat dep.sql #可以看到基本就是SQL語(yǔ)句
-- MySQL dump 10.13? Distrib 5.7.22, for linux-glibc2.12 (x86_64)
--
-- Host: localhost??? Database: employees
-- ------------------------------------------------------
-- Server version?? ?5.7.22-log
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `departments`
--
DROP TABLE IF EXISTS `departments`; #看到這里發(fā)現(xiàn)了建表語(yǔ)句,也就是沒(méi)有建庫(kù)語(yǔ)句,因此若想把sql語(yǔ)句導(dǎo)入指定庫(kù),需要先創(chuàng)建庫(kù)
/*!40101 SET @saved_cs_client???? = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `departments` (
? `dept_no` char(4) NOT NULL,
? `dept_name` varchar(40) NOT NULL,
? PRIMARY KEY (`dept_no`),
? UNIQUE KEY `dept_name` (`dept_name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `departments`
--
LOCK TABLES `departments` WRITE;
/*!40000 ALTER TABLE `departments` DISABLE KEYS */; #插入語(yǔ)句
INSERT INTO `departments` VALUES ('d009','Customer Service'),('d005','Development'),('d002','Finance'),('d003','Human Resources'),('d001','Marketing'),('d004','Production'),('d006','Quality Management'),('d008','Research'),('d007','Sales');
/*!40000 ALTER TABLE `departments` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2018-11-28? 9:51:01
在備份文件中插入二進(jìn)制日志的信息
該選項(xiàng)將binlog的位置和文件名追加到輸出文件中。如果為1,將會(huì)輸出CHANGE MASTER 命令;如果為2,輸出的CHANGE MASTER命令前添加注釋信息。該選項(xiàng)將打開(kāi)
--lock-all-tables 選項(xiàng),除非--single-transaction也被指定(在這種情況下,全局讀鎖在開(kāi)始導(dǎo)出時(shí)獲得很短的時(shí)間)。該選項(xiàng)自動(dòng)關(guān)閉--lock-tables選項(xiàng)。
[root@test3 mysql]# mysqldump -uroot -p123456 --single-transaction --master-data employees departments > dep.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@test3 mysql]# cat dep.sql
-- MySQL dump 10.13? Distrib 5.7.22, for linux-glibc2.12 (x86_64)
--
-- Host: localhost??? Database: employees
-- ------------------------------------------------------
-- Server version?? ?5.7.22-log
......
--
-- Position to start replication or point-in-time recovery from #這里有個(gè)提示基于這個(gè)點(diǎn)開(kāi)始復(fù)制或者PIT恢復(fù)
--
CHANGE MASTER TO MASTER_LOG_FILE='test3-bin.000001', MASTER_LOG_POS=20182;
.....
#mysqldump備份時(shí)常用的兩個(gè)選項(xiàng) --single-transaction Creates a consistent snapshot by dumping all tables in asingle transaction. Works ONLY for tables stored instorage engines which support multiversioning (currentlyonly InnoDB does); the dump is NOT guaranteed to beconsistent for other storage engines. While a--single-transaction dump is in process, to ensure avalid dump file (correct table contents and binary logposition), no other connection should use the followingstatements: ALTER TABLE, DROP TABLE, RENAME TABLE,TRUNCATE TABLE, as consistent snapshot is not isolatedfrom them. Option automatically turns off --lock-tables. 在備份INNODB數(shù)據(jù)庫(kù)時(shí),事實(shí)上必須加上--single-transaction參數(shù),這個(gè)參數(shù)會(huì)保證備份出的數(shù)據(jù)是一致的,也就是備份的數(shù)據(jù)是當(dāng)前執(zhí)行此命令時(shí)刻點(diǎn)的數(shù)據(jù)。 --single-transaction利用INNODB的MVCC特性,在備份數(shù)據(jù)會(huì)根據(jù)undo和redo得到一份快照數(shù)據(jù)。INNODB的MVCC特性在RR和RC的隔離級(jí)別下,得到的快照數(shù)據(jù)是不同,在RR 得到的是當(dāng)前事務(wù)開(kāi)始時(shí)的快照數(shù)據(jù),在RC時(shí)得到的最新的事務(wù)數(shù)據(jù)。因?yàn)閿?shù)據(jù)庫(kù)的正式環(huán)境一般是RC模式,因此這條命令在備份開(kāi)始時(shí),會(huì)設(shè)置當(dāng)前會(huì)話的隔離級(jí)別為RR模式! --single-transaction 參數(shù)說(shuō)明
備份單個(gè)庫(kù)和備份所有的庫(kù)
[root@test3 mysql]# mysqldump -uroot -p123456 --single-transaction --master-data --databases cmdb hostinfo > dep.sql mysqldump: [Warning] Using a password on the command line interface can be insecure. [root@test3 mysql]# mysqldump -uroot -p123456 --single-transaction --master-data --all-databases > all.sql mysqldump: [Warning] Using a password on the command line interface can be insecure. #查看數(shù)據(jù) [root@test3 mysql]# cat dep.sql #查看其中的一個(gè)數(shù)據(jù) -- MySQL dump 10.13 Distrib 5.7.22, for linux-glibc2.12 (x86_64) -- -- Host: localhost Database: cmdb -- ------------------------------------------------------ -- Server version 5.7.22-log ......-- -- Position to start replication or point-in-time recovery from --CHANGE MASTER TO MASTER_LOG_FILE='test3-bin.000001', MASTER_LOG_POS=20182;-- -- Current Database: `cmdb` #這里有了創(chuàng)建數(shù)據(jù)庫(kù)的語(yǔ)句 --CREATE DATABASE /*!32312 IF NOT EXISTS*/ `cmdb` /*!40100 DEFAULT CHARACTER SET utf8 */;USE `cmdb`;#因此在使用指定庫(kù)備份文件恢復(fù)數(shù)據(jù)時(shí),不需要再創(chuàng)建庫(kù),直接恢復(fù)即可
恢復(fù)數(shù)據(jù)的時(shí)候直接使用mysql導(dǎo)入即可:
mysql -uroot -p123456 < all.sql切記在備份INNODB數(shù)據(jù)庫(kù)時(shí)一定要加上--single-transaction 參數(shù),為了基于PIT恢復(fù)也要加上--master-data參數(shù)。
mysqldump的備份過(guò)程
上面我們已經(jīng)看到了mysqldump備份出的數(shù)據(jù)文件時(shí)對(duì)應(yīng)sql語(yǔ)句,我們查看一下在執(zhí)行mysqldump時(shí),MySQL數(shù)據(jù)庫(kù)做了哪些操作!
首先開(kāi)啟general_log日志,如下:
mysql> set global general_log=on; Query OK, 0 rows affected (0.00 sec) mysql> set global log_output="file"; Query OK, 0 rows affected (0.00 sec) mysql> show variables like "%general%"; +------------------+-----------------------+ | Variable_name | Value | +------------------+-----------------------+ | general_log | ON | | general_log_file | /data/mysql/test3.log | +------------------+-----------------------+ 2 rows in set (0.00 sec)然后再去使用mysqldump備份一次數(shù)據(jù)文件
[root@test3 ~]# mysqldump -uroot -p123456 --single-transaction --master-data --databases tpcc_test > dep.sql mysqldump: [Warning] Using a password on the command line interface can be insecure. [root@test3 ~]#最后查看general_log日志,如下:
[root@test3 mysql]# cat test3.log 2018-11-28T05:20:31.014426Z 29 Connect root@localhost on using Socket 2018-11-28T05:20:31.014662Z 29 Query /*!40100 SET @@SQL_MODE='' */ 2018-11-28T05:20:31.014792Z 29 Query /*!40103 SET TIME_ZONE='+00:00' */ 2018-11-28T05:20:31.014915Z 29 Query FLUSH /*!40101 LOCAL */ TABLES 2018-11-28T05:20:31.015141Z 29 Query FLUSH TABLES WITH READ LOCK #這里有個(gè)鎖表 2018-11-28T05:20:31.015213Z 29 Query SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ #設(shè)置當(dāng)前會(huì)話的隔離級(jí)別 2018-11-28T05:20:31.015271Z 29 Query START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */ #開(kāi)始事務(wù) 2018-11-28T05:20:31.015463Z 29 Query SHOW VARIABLES LIKE 'gtid\_mode' #備份gtid信息 2018-11-28T05:20:31.018393Z 29 Query SHOW MASTER STATUS #在備份時(shí)指定master-data,這里備份日志點(diǎn)信息 2018-11-28T05:20:31.018467Z 29 Query UNLOCK TABLES #釋放表 2018-11-28T05:20:31.018618Z 29 Query SELECT LOGFILE_GROUP_NAME, FILE_NAME, TOTAL_EXTENTS, INITIAL_SIZE, ENGINE, EXTRA FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'UNDO LOG' AND FILE_NAME IS NOT NULL AND LOGFILE_GROUP_NAME IS NOT NULL AND LOGFILE_GROUP_NAME IN (SELECT DISTINCT LOGFILE_GROUP_NAME FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'DATAFILE' AND TABLESPACE_NAME IN (SELECT DISTINCT TABLESPACE_NAME FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA IN ('tpcc_test'))) GROUP BY LOGFILE_GROUP_NAME, FILE_NAME, ENGINE, TOTAL_EXTENTS, INITIAL_SIZE ORDER BY LOGFILE_GROUP_NAME 2018-11-28T05:20:31.021966Z 29 Query SELECT DISTINCT TABLESPACE_NAME, FILE_NAME, LOGFILE_GROUP_NAME, EXTENT_SIZE, INITIAL_SIZE, ENGINE FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'DATAFILE' AND TABLESPACE_NAME IN (SELECT DISTINCT TABLESPACE_NAME FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA IN ('tpcc_test')) ORDER BY TABLESPACE_NAME, LOGFILE_GROUP_NAME 2018-11-28T05:20:31.022750Z 29 Query SHOW VARIABLES LIKE 'ndbinfo\_version' 2018-11-28T05:20:31.023915Z 29 Init DB tpcc_test 2018-11-28T05:20:31.023977Z 29 Query SHOW CREATE DATABASE IF NOT EXISTS `tpcc_test` 2018-11-28T05:20:31.024045Z 29 Query SAVEPOINT sp #備份每張表之前會(huì)設(shè)置保存點(diǎn) 2018-11-28T05:20:31.024100Z 29 Query show tables 2018-11-28T05:20:31.024253Z 29 Query show table status like 'customer' 2018-11-28T05:20:31.024475Z 29 Query SET SQL_QUOTE_SHOW_CREATE=1 2018-11-28T05:20:31.024541Z 29 Query SET SESSION character_set_results = 'binary' 2018-11-28T05:20:31.024607Z 29 Query show create table `customer` 2018-11-28T05:20:31.024737Z 29 Query SET SESSION character_set_results = 'utf8' 2018-11-28T05:20:31.024806Z 29 Query show fields from `customer` 2018-11-28T05:20:31.025199Z 29 Query show fields from `customer` 2018-11-28T05:20:31.025582Z 29 Query SELECT /*!40001 SQL_NO_CACHE */ * FROM `customer` 2018-11-28T05:20:35.251932Z 29 Query SET SESSION character_set_results = 'binary' 2018-11-28T05:20:35.252069Z 29 Query use `tpcc_test` 2018-11-28T05:20:35.252158Z 29 Query select @@collation_database 2018-11-28T05:20:35.252290Z 29 Query SHOW TRIGGERS LIKE 'customer' 2018-11-28T05:20:35.252706Z 29 Query SET SESSION character_set_results = 'utf8' 2018-11-28T05:20:35.252771Z 29 Query ROLLBACK TO SAVEPOINT sp #這張表備份結(jié)束之后,回滾保存點(diǎn)......
......
以上的過(guò)程可以看到,mysqldump是在一個(gè)事務(wù)中備份的,因此在備份表時(shí)會(huì)產(chǎn)生undo日志,若是表數(shù)據(jù)太大,則undo日志也會(huì)很大,因此mysqldump在備份每張表時(shí)都設(shè)置
savepoint,這樣當(dāng)這個(gè)表備份完成之后,就會(huì)回滾保存點(diǎn),然后purge線程就會(huì)回收undo日志
mysqld的其余常見(jiàn)參數(shù)應(yīng)用:
-d:只備份指定數(shù)據(jù)庫(kù)表的結(jié)構(gòu)(也就是建表語(yǔ)句)
[root@test3 ~]# mysqldump -uroot -p123456 -d --databases lianxi > dep.sql #這樣只備份出lianxi這個(gè)庫(kù)中表的建表語(yǔ)句和創(chuàng)建庫(kù)的語(yǔ)句[root@test3 ~]# mysqldump -uroot -p123456 -d lianxi tb2 > dep.sql #如果這里只備份庫(kù)下面的表,則還是沒(méi)有建庫(kù)語(yǔ)句,只有創(chuàng)建表的語(yǔ)句
-R, --routines :備份時(shí)導(dǎo)出存儲(chǔ)過(guò)程和自定義函數(shù)!
[root@test3 ~]# mysqldump -uroot -p123456 -R lianxi tb2 > dep.sql-f, --force???????? Continue even if we get an SQL error.。發(fā)生錯(cuò)誤的時(shí)候也繼續(xù)備份。
mysqldump還有很多參數(shù),可以在用到的時(shí)候查看!
mysqldump是邏輯備份,單線程備份,單線程恢復(fù),因此會(huì)比較慢。特別是恢復(fù)的時(shí)候,之前恢復(fù)過(guò)一個(gè)800多萬(wàn)行記錄的數(shù)據(jù),結(jié)果使用mysql逐條導(dǎo)入sql語(yǔ)句,搞庫(kù)幾個(gè)小時(shí)。
?
備份與恢復(fù)糾錯(cuò)
?1:在使用mysql導(dǎo)入mysqldump的備份數(shù)據(jù)時(shí),報(bào)了如下錯(cuò)誤:
[root@test3 ~]# mysql -uroot -p123456 financesys < financesys.sql mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 1118 (42000) at line 25: Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.錯(cuò)誤原因就是行太長(zhǎng)了,但是線上環(huán)境修改字段屬性有點(diǎn)不太合適,可以采用如下方法:
mysql> set global innodb_strict_mode=off; Query OK, 0 rows affected (0.00 sec) [root@test3 ~]# mysql -uroot -p123456 financesys < financesys.sql #再導(dǎo)入就可以了 mysql: [Warning] Using a password on the command line interface can be insecure. 從MySQL5.5.X版本開(kāi)始,你可以開(kāi)啟InnoDB嚴(yán)格檢查模式,尤其采用了頁(yè)數(shù)據(jù)壓縮功能后,最好是開(kāi)啟該功能。開(kāi)啟此功能后,當(dāng)創(chuàng)建表(CREATE TABLE)、更改表(ALTER TABLE)和創(chuàng)建索引(CREATE INDEX)語(yǔ)句時(shí),如果寫法有錯(cuò)誤,不會(huì)有警告信息,而是直接拋出錯(cuò)誤,這樣就可直接將問(wèn)題扼殺在搖籃里。開(kāi)啟InnoDB嚴(yán)格檢查模式涉及的參數(shù)是innodb_strict_mode,默認(rèn)為OFF,支持動(dòng)態(tài)開(kāi)啟,開(kāi)啟方式如下: set global innodb_strict_mode=1;連接地址導(dǎo)入成功后,如果是線上環(huán)境,還需要把參數(shù)修改回去!
2:在使用mysqldump備份的時(shí)候出現(xiàn)如下問(wèn)題
[root@test2 data]# mysqldump -uroot -p7abec53701c3eefb --databases financesys > financesys1.sql mysqldump: Error 2013: Lost connection to MySQL server during query when dumping table `fi_factincome` at row: 1303198我查了一下,這個(gè)表大概有1500萬(wàn)行的記錄,報(bào)錯(cuò)原因如下:
備份失敗的原因:在向磁盤上備份的時(shí)候,數(shù)據(jù)的流向是這樣的:MySQL Server 端從數(shù)據(jù)文件中檢索出數(shù)據(jù),然后分批將數(shù)據(jù)返回給mysqldump 客戶端,然后mysqldump 將數(shù)據(jù)寫入到磁盤上。一般地,向 磁盤 上寫入數(shù)據(jù)的速度較之Server端檢索發(fā)送數(shù)據(jù)的速度要慢得多,這就會(huì)導(dǎo)致 mysqldump 無(wú)法及時(shí)的接受
Server 端發(fā)送過(guò)來(lái)的數(shù)據(jù),Server 端的數(shù)據(jù)就會(huì)積壓在內(nèi)存中等待發(fā)送,這個(gè)等待不是無(wú)限期的,當(dāng) Server 的等待時(shí)間超過(guò) net_write_timeout(默認(rèn)是60秒)
時(shí)它就失去了耐心,mysqldump 的連接會(huì)被斷開(kāi),同時(shí)拋出錯(cuò)誤 Got error: 2013: Lost connection。其實(shí)該錯(cuò)誤不是說(shuō)數(shù)據(jù)庫(kù)文件太多而導(dǎo)致出錯(cuò),
而是單張表數(shù)據(jù)量太大導(dǎo)致備份失敗
問(wèn)題的解決方案:增加 net_write_timeout 可以解決上述的問(wèn)題的。在實(shí)踐中發(fā)現(xiàn),在增大 net_write_timeout 后,Server 端會(huì)消耗更多的內(nèi)存,有時(shí)甚至?xí)?dǎo)致 swap 的使用(并不確定是不是修改 net_write_timeout 所至)。建議在mysqldump 之前修改 net_write_timeout 為一個(gè)較大的值(如1800),在 mysqldump 結(jié)束后,在將這個(gè)值修改到默認(rèn)的60。(備注:net_write_timeout不是mysqldump的配置參數(shù),而是mysql的參數(shù))
?
轉(zhuǎn)載于:https://www.cnblogs.com/wxzhe/p/10032153.html
總結(jié)
以上是生活随笔為你收集整理的MySQL备份与恢复-mysqldump备份与恢复的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 兴业信用卡随借金额度是多少?怎么恢复额度
- 下一篇: 农行信用卡消费备用金怎么还?备用金还款方