mysqldump的原理:mysqldump命令備份數據的過程,實際上就是把數據從mysql庫裏以邏輯的sql語句的形式直接輸出到標準輸出,要想保存到文件,咱們須要用到輸出重定向到文件來保存。mysql
語法:mysqldump -u用戶名 -p密碼 [-hmysql數據庫地址] 要備份的數據庫名 [要備份的表名] > 備份文件名sql
--compact 優化備份文件大小減小輸出註釋,主要用於debug調試shell
[root@qiuhom bak]# mysqldump -uroot -padmin qiuhom test >/work/bak/qiuhom.sql
[root@qiuhom bak]# cat qiuhom.sql
-- MySQL dump 10.13 Distrib 5.5.32, for Linux (x86_64)
--
-- Host: localhost Database: qiuhom
-- ------------------------------------------------------
-- Server version 5.5.32-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 `test`
--
DROP TABLE IF EXISTS `test`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `test` (
`id` int(11) NOT NULL,
`name` char(10) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `test`
--
LOCK TABLES `test` WRITE;
/*!40000 ALTER TABLE `test` DISABLE KEYS */;
INSERT INTO `test` VALUES (1,'a'),(2,'b'),(3,'c');
/*!40000 ALTER TABLE `test` 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-10-06 13:14:03
[root@qiuhom bak]# mysqldump -uroot -padmin --compact qiuhom test >/work/bak/qiuhom.sql
[root@qiuhom bak]# cat qiuhom.sql
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `test` (
`id` int(11) NOT NULL,
`name` char(10) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
INSERT INTO `test` VALUES (1,'a'),(2,'b'),(3,'c');
說明:能夠看出當咱們不加--compact這個選項時 備份出來的sql文件有不少註釋和一些沒有用的垃圾信息。可是加上--compact這個選項後,有些選項的內容也是被過濾掉不顯示的好比:-skip-add-drop-table --no-set-names數據庫
--skip-disable-keys --skip-add-locks這些選項的信息就不會給出。因此--compact這個選項咱們用於debug調試。正式環境仍是不要用這個選項vim
-B 指定數據庫,能夠多個數據庫,注意-B參數後面所有是接的庫名,不能跟表名。bash
1.01備份多個庫
mysqldump -uroot -padmin -B 庫1 庫2 庫3 > /work/bak/xxx.sqlapp
[root@qiuhom ~]# mysqldump -uroot -padmin -B qiuhom qiuhom_gbk > /work/bak/qiuhom_qiuhom_gbk.sql [root@qiuhom ~]# egrep -v "#|\*|--|^$" /work/bak/qiuhom_qiuhom_gbk.sql USE `qiuhom`; DROP TABLE IF EXISTS `test`; CREATE TABLE `test` ( `id` int(11) NOT NULL, `name` char(10) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; LOCK TABLES `test` WRITE; INSERT INTO `test` VALUES (1,'a'),(2,'b'),(3,'c'); UNLOCK TABLES; USE `qiuhom_gbk`; DROP TABLE IF EXISTS `test_gbk`; CREATE TABLE `test_gbk` ( `id` int(11) NOT NULL, `name` char(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=gbk; LOCK TABLES `test_gbk` WRITE; INSERT INTO `test_gbk` VALUES (1,'hh'),(2,'ff'),(3,'xx'); UNLOCK TABLES;
1.02備份單個庫
mysqldump -uroot -padmin 庫名 >/work/bak/xxx.sql優化
[root@qiuhom bak]# mysqldump -uroot -padmin --compact qiuhom_gbk /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `test_gbk` ( `id` int(11) NOT NULL, `name` char(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=gbk; /*!40101 SET character_set_client = @saved_cs_client */; INSERT INTO `test_gbk` VALUES (1,'hh'),(2,'ff'),(3,'xx');
mysqldump -uroot -padmin -B 庫名 >/work/bak/xxx.sqlspa
[root@qiuhom bak]# mysqldump -uroot -padmin --compact -B qiuhom_gbk CREATE DATABASE /*!32312 IF NOT EXISTS*/ `qiuhom_gbk` /*!40100 DEFAULT CHARACTER SET gbk */; USE `qiuhom_gbk`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `test_gbk` ( `id` int(11) NOT NULL, `name` char(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=gbk; /*!40101 SET character_set_client = @saved_cs_client */; INSERT INTO `test_gbk` VALUES (1,'hh'),(2,'ff'),(3,'xx');
說明:從以上兩條命令返回的結果來看我能夠得出一點 mysql備份加上-B的選項時 ,備份的sql文件裏就會多一條create 備份數據庫名 和use 備份數據庫名,這兩條條語句,全部加-B備份的庫 在還原時能夠不指定庫名,也能夠不用顧慮還原的庫是否存在,直接還原便可。沒有加-B選項備份的還原就須要考慮庫是否存在,還要指定庫名。這就是加-B的好處。命令行
1.03備份多個表
mysqldump -uroot -padmin 庫名 表1名 表2名 >/work/bak/xxx.sql
[root@qiuhom bak]# mysqldump -uroot -padmin --compact qiuhom test test1 test2 >/work/bak/qiuhom_tables.sql [root@qiuhom bak]# cat qiuhom_tables.sql /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `test` ( `id` int(11) NOT NULL, `name` char(10) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; INSERT INTO `test` VALUES (1,'a'),(2,'b'),(3,'c'); /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `test1` ( `id` int(11) DEFAULT NULL, `name` char(1) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `test2` ( `id` int(11) DEFAULT NULL, `name` char(1) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */;
1.04備份單個表
mysqldump -uroot -padmin 庫名 表名 > /work/bak/xxx.sql
[root@qiuhom bak]# mysqldump -uroot -padmin --compact qiuhom test >/work/bak/qiuhom__test.sql [root@qiuhom bak]# cat qiuhom__test.sql /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `test` ( `id` int(11) NOT NULL, `name` char(10) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; INSERT INTO `test` VALUES (1,'a'),(2,'b'),(3,'c');
說明:備份表的語法是一個庫名後面能夠跟一個表或者多個表名,但都是同一個庫裏的表。
-d 備份表結構
1.05備份單表結構
mysqldump -uroot -padmin -d 庫名 表名 >/work/bak/xxx.sql
[root@qiuhom bak]# mysqldump -uroot -padmin --compact -d qiuhom test >/work/bak/qiuhom__test.sql [root@qiuhom bak]# cat qiuhom__test.sql /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `test` ( `id` int(11) NOT NULL, `name` char(10) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */;
說明:能夠看出加上-d選項後,備份到sql文件裏沒有insert into 語句插入數據,只有建表的語句。
1.06備份多表結構
mysqldump -uroot -padmin -d 庫名 表名1 代表2 >/work/bak/xxx.sql
[root@qiuhom bak]# mysqldump -uroot -padmin --compact -d qiuhom test test1>/work/bak/qiuhom__test.sql [root@qiuhom bak]# cat qiuhom__test.sql /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `test` ( `id` int(11) NOT NULL, `name` char(10) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `test1` ( `id` int(11) DEFAULT NULL, `name` char(1) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */;
1.07備份某庫裏的全部表結構
mysqldump -uroot -padmin -d 庫名 >/work/bak/xxx.sql
[root@qiuhom bak]# mysqldump -uroot -padmin --compact -d qiuhom >/work/bak/qiuhom__test.sql [root@qiuhom bak]# cat qiuhom__test.sql /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `test` ( `id` int(11) NOT NULL, `name` char(10) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `test1` ( `id` int(11) DEFAULT NULL, `name` char(1) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `test2` ( `id` int(11) DEFAULT NULL, `name` char(1) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */;
說明:備份表結構和備份表都是同樣的語法只是多-d的選項,也是在同一個庫裏面的,不能跨庫的去備份。
-t 只備份數據
1.08單表備份數據
mysqldump -uroot -padmin -t 庫名 表名 >/work/bak/xxx.sql
[root@qiuhom bak]# mysqldump -uroot -padmin --compact -t qiuhom test>/work/bak/qiuhom__test.sql [root@qiuhom bak]# cat qiuhom__test.sql INSERT INTO `test` VALUES (1,'a'),(2,'b'),(3,'c');
1.09多表備份數據
mysqldump -uroot -padmin -t 庫名 表名1 表名2>/work/bak/xxx.sql
[root@qiuhom bak]# mysqldump -uroot -padmin --compact -t qiuhom test test1>/work/bak/qiuhom__test.sql [root@qiuhom bak]# cat qiuhom__test.sql INSERT INTO `test` VALUES (1,'a'),(2,'b'),(3,'c'); INSERT INTO `test1` VALUES (1,'a'),(2,'b'),(3,'c'),(4,'d'),(1,'a'),(2,'b'),(3,'c'),(4,'d');
1.10備份整個庫的表數據
mysqldump -uroot -padmin -t 庫名 >/work/bak/xxx.sql
[root@qiuhom bak]# mysqldump -uroot -padmin --compact -t qiuhom>/work/bak/qiuhom__test.sql [root@qiuhom bak]# cat qiuhom__test.sql INSERT INTO `test` VALUES (1,'a'),(2,'b'),(3,'c'); INSERT INTO `test1` VALUES (1,'a'),(2,'b'),(3,'c'),(4,'d'),(1,'a'),(2,'b'),(3,'c'),(4,'d'); INSERT INTO `test2` VALUES (1,'a'),(2,'b'),(3,'c'),(4,'d'),(5,'e');
說明:備份數據和備份表、備份表結構都是同樣,必須跟庫名 而後是表名,一個或多個,不能跨庫備份。
-A 備份數據庫裏的全部庫的內容
mysqldump -uroot -padmin -A >/work/bak/xxx.sql
[root@qiuhom bak]# mysqldump -uroot -padmin --compact -A >/work/bak/qiuhom__test.sql [root@qiuhom bak]# cat qiuhom__test.sql CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysql` /*!40100 DEFAULT CHARACTER SET utf8 */; USE `mysql`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE IF NOT EXISTS `general_log` ( `event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `user_host` mediumtext NOT NULL, `thread_id` int(11) NOT NULL, `server_id` int(10) unsigned NOT NULL, `command_type` varchar(64) NOT NULL, `argument` mediumtext NOT NULL ) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log'; /*!40101 SET character_set_client = @saved_cs_client */; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE IF NOT EXISTS `slow_log` ( `start_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `user_host` mediumtext NOT NULL, `query_time` time NOT NULL, `lock_time` time NOT NULL, `rows_sent` int(11) NOT NULL, `rows_examined` int(11) NOT NULL, `db` varchar(512) NOT NULL, `last_insert_id` int(11) NOT NULL, `insert_id` int(11) NOT NULL, `server_id` int(10) unsigned NOT NULL, `sql_text` mediumtext NOT NULL ) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log'; 因爲內容過多。。只截取了部分做爲展現
說明:加了-A選項 就表示備份整個數據庫的內容,包括mysql系統的庫都給一塊兒備份下來了
-F 刷新bin-log
這個參數的主要做用是刷新binlog文件,就是你每備份一次binlog文件就會自動刷新爲一個新的文件
[root@qiuhom bak]# ll /application/mysql/data/mysql-bin* ls: cannot access /application/mysql/data/mysql-bin*: No such file or directory [root@qiuhom bak]# mysqldump -uroot -padmin -B qiuhom >/work/bak/qiuhom.sql [root@qiuhom bak]# ll /application/mysql/data/mysql-bin* ls: cannot access /application/mysql/data/mysql-bin*: No such file or directory [root@qiuhom bak]# mysqldump -uroot -padmin -F -B qiuhom >/work/bak/qiuhom.sql [root@qiuhom bak]# ll /application/mysql/data/mysql-bin* -rw-rw---- 1 mysql mysql 107 Oct 6 12:50 /application/mysql/data/mysql-bin.000001 -rw-rw---- 1 mysql mysql 19 Oct 6 12:50 /application/mysql/data/mysql-bin.index [root@qiuhom bak]# mysqldump -uroot -padmin -F -B qiuhom >/work/bak/qiuhom.sql [root@qiuhom bak]# ll /application/mysql/data/mysql-bin* -rw-rw---- 1 mysql mysql 150 Oct 6 12:50 /application/mysql/data/mysql-bin.000001 -rw-rw---- 1 mysql mysql 107 Oct 6 12:50 /application/mysql/data/mysql-bin.000002 -rw-rw---- 1 mysql mysql 38 Oct 6 12:50 /application/mysql/data/mysql-bin.index
這裏順便說下binlog怎麼開啓吧,binlog是mysql的日誌文件,記錄着mysql內部增刪改查等對mysql數據庫有更新的內容記錄,這個文件至關重要,對恢復數據有很大的幫助,全部通常狀況咱們都是把他給開啓的。開啓binlog很簡單在mysql的配置文件裏找到log-bin=mysql-bin,默認是關閉的狀態,就是註釋掉的,咱們把註釋去掉,保存退出後重啓mysql 咱們就能夠在mysql安裝的目錄的data目錄看到mysql-bin.000001等名字的文件 這個就是binlog文件。這個文件是mysql的日誌文件,通常咱們用mysqlbinlog 這個命令去查看裏面的內容,用cat和vim都是亂碼。
--master-data 增長bin-log日誌文件名及對應的位置點
mysqldump導出數據時,當這個選項的值爲1的時候,mysqldump出來的文件就會包括CHANGE MASTER TO這個語句,CHANGE MASTER TO後面緊接着就是binlog文件和position的記錄信息,在slave上導入數據時就會執行這個語句,salve就會根據指定這個文件位置從master端複製binlog。默認狀況下這個選項的值是1;當這個選項的值是2的時候,chang master to也是會寫到dump文件裏面去的,可是這個語句是被註釋的狀態。
[root@qiuhom bak]# mysqldump -uroot -padmin --compact --master-data=1 qiuhom test >/work/bak/qiuhom.sql [root@qiuhom bak]# cat qiuhom.sql CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000005', MASTER_LOG_POS=107; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `test` ( `id` int(11) NOT NULL, `name` char(10) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; INSERT INTO `test` VALUES (1,'a'),(2,'b'),(3,'c'); [root@qiuhom bak]# mysqldump -uroot -padmin --compact --master-data=2 qiuhom test >/work/bak/qiuhom.sql [root@qiuhom bak]# cat qiuhom.sql -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000005', MASTER_LOG_POS=107; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `test` ( `id` int(11) NOT NULL, `name` char(10) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; INSERT INTO `test` VALUES (1,'a'),(2,'b'),(3,'c');
2.分庫備份和恢復
2.1命令拼接法
思想:咱們用mysql -e的方式去查詢數據裏的全部庫,而後過濾掉不須要備份的庫,而後用sed拼接命令來完成,最後把拼接好的字符命令交給bash執行
mysql -uroot -padmin -e "show databases;"|grep -Evi "database|info|perfo"|sed -r 's#^([a-z].*$)#mysqldump -uroot -padmin -B --events \1|gzip >/work/bak/\1.sql.gz#g'|bash
說明:咱們已經知道備份庫的方法,所謂分庫備份就是把一個庫一個庫單獨備份成單獨的文件,方便往後某個庫出問題好恢復,這也分庫備份的意義所在,以上命令的核心思想就是經過命令把要執行備份的數據庫名和備份數據庫名的命令字符做組合成命令,而後再經過管道傳給bash去執行。
2.2shell腳本,for循環
思想:利用mysql -e在Linux命令行裏執行sql語句取出全部須要備份的數據庫名,而後經過for循環去循環執行備份的命令。
#!/bin/bash dbname=`mysql -uroot -padmin -e "show databases;"|grep -Evi "database|info|perfo"` for db in ${dbname} do mysqldump -uroot -padmin -B $db |gzip >/work/bak/${db}.sql.gz done
2.3批量恢復分庫備份的數據庫
思想:從上面的腳本看,咱們要注意一下恢復的原理,恢復的原理就是把sql文件裏的sql語句給在mysql裏執行一遍,由於上面的備份咱們作過壓縮,因此第一件事就是把壓縮的備份文件給解壓。其次用for循環去循環執行文件裏的內容,還有一點須要注意的是你要看你備份時是否用-B去指定庫名,若是沒有,恢復的時候就要指定庫名,因此還要考慮庫是否存在的問題,這是不用-B須要考慮的。
#!/bin/bash if [ `ls /work/bak/*.gz|wc -l` -ne 0 ];then gzip -d /work/bak/* for dbname in `ls /work/bak/*.sql` do mysql -uroot -padmin </work/bak/${dbname} done fi
說明:以上由於備份用到-B 因此恢復時不須要判斷是否存在數據庫,以及指定數據庫。
3.分庫分表備份和恢復
3.1批量分庫分表備份
思想:第一層for循環負責循環庫,第二層for循環負責循環庫裏的表,最終是一個庫循環備份完庫裏的全部表後,在進行循環第二個庫,以此類推。
#!/bin/bash dbname=`mysql -uroot -padmin -e "show databases;"|grep -Evi "database|info|perfo"` for db in ${dbname } do for tb in `mysql -uroot -padmin -e "use ${db};show tables;"|grep -vi "Tables_in_${db}"` do mysqldump -uroot -padmin ${db} ${tb} |gzip >/work/bak/${dbname}__${tb}.sql.gz done done
3.2批量恢復分庫分表備份
思想:和分庫分表備份思想同樣,只是還原的時候要指定庫 因此要把庫名給切出來,其次就是表名,表名要分出那個庫裏有哪些表,而後一個庫裏的全部表還原完後,在循環還原下一個庫,同理咱們分離表名的時候也是,一個庫裏的全部表名所有分離出來後,就還原一個庫裏的全部表,還原完了還原下一個庫。
#!/bin/bash dbname=`ls -l /work/bak/|awk '{print $9}'|awk -F "__" '{print $1}'|uniq|grep -Ev "^$"` for db in ${dbname} do if [ `mysql -uroot -padmin -e "show databases;"|grep -E "^($db)$"|wc -l` -eq 0 ];then mysql -uroot -padmin -e "create database $db;" fi #db_tb=`ls -l /work/bak/|grep ${db}|awk -F "__" '{print $2}'|sed 's#.sql.gz##g'` #db_tb=`ls -l /work/bak/|grep ${db}|awk -F "__" '{print $2}'|cut -d. -f1` db_tb=`ls -l /work/bak/|grep ${db}|awk -F "__" '{print $2}'|awk -F "." '{print $1}'` ###分離相同庫裏的各個表 for tb in ${db_tb} do gzip -d /work/bak/${db}__${tb}.sql.gz mysql -uroot -padmin $db </work/bak/${db}__${tb}.sql done done
3.3分庫分表恢復命令拼接
ls -l /work/bak/|awk '{print $9}'|sed -r 's#(^.*)__(.*).sql.gz#gzip -d /work/bak/\1__\2.sql.gz; mysql -uroot -padmin \1 </work/bak/\1__\2.sql#g'|bash
提示:以上命令需庫存中的狀況使用,若庫不存在還須要考慮庫的問題。
[root@qiuhom ~]# mysql -uroot -padmin -e "use qiuhom;show tables;" [root@qiuhom ~]# ls -l /work/bak/|awk '{print $9}'|sed -r 's#(^.*)__(.*).sql.gz#gzip -d /work/bak/\1__\2.sql.gz; mysql -uroot -padmin \1 </work/bak/\1__\2.sql#g' gzip -d /work/bak/mysql__columns_priv.sql.gz; mysql -uroot -padmin mysql </work/bak/mysql__columns_priv.sql gzip -d /work/bak/mysql__db.sql.gz; mysql -uroot -padmin mysql </work/bak/mysql__db.sql gzip -d /work/bak/mysql__event.sql.gz; mysql -uroot -padmin mysql </work/bak/mysql__event.sql gzip -d /work/bak/mysql__func.sql.gz; mysql -uroot -padmin mysql </work/bak/mysql__func.sql gzip -d /work/bak/mysql__general_log.sql.gz; mysql -uroot -padmin mysql </work/bak/mysql__general_log.sql gzip -d /work/bak/mysql__help_category.sql.gz; mysql -uroot -padmin mysql </work/bak/mysql__help_category.sql gzip -d /work/bak/mysql__help_keyword.sql.gz; mysql -uroot -padmin mysql </work/bak/mysql__help_keyword.sql gzip -d /work/bak/mysql__help_relation.sql.gz; mysql -uroot -padmin mysql </work/bak/mysql__help_relation.sql gzip -d /work/bak/mysql__help_topic.sql.gz; mysql -uroot -padmin mysql </work/bak/mysql__help_topic.sql gzip -d /work/bak/mysql__host.sql.gz; mysql -uroot -padmin mysql </work/bak/mysql__host.sql gzip -d /work/bak/mysql__ndb_binlog_index.sql.gz; mysql -uroot -padmin mysql </work/bak/mysql__ndb_binlog_index.sql gzip -d /work/bak/mysql__plugin.sql.gz; mysql -uroot -padmin mysql </work/bak/mysql__plugin.sql gzip -d /work/bak/mysql__procs_priv.sql.gz; mysql -uroot -padmin mysql </work/bak/mysql__procs_priv.sql gzip -d /work/bak/mysql__proc.sql.gz; mysql -uroot -padmin mysql </work/bak/mysql__proc.sql gzip -d /work/bak/mysql__proxies_priv.sql.gz; mysql -uroot -padmin mysql </work/bak/mysql__proxies_priv.sql gzip -d /work/bak/mysql__servers.sql.gz; mysql -uroot -padmin mysql </work/bak/mysql__servers.sql gzip -d /work/bak/mysql__slow_log.sql.gz; mysql -uroot -padmin mysql </work/bak/mysql__slow_log.sql gzip -d /work/bak/mysql__tables_priv.sql.gz; mysql -uroot -padmin mysql </work/bak/mysql__tables_priv.sql gzip -d /work/bak/mysql__time_zone_leap_second.sql.gz; mysql -uroot -padmin mysql </work/bak/mysql__time_zone_leap_second.sql gzip -d /work/bak/mysql__time_zone_name.sql.gz; mysql -uroot -padmin mysql </work/bak/mysql__time_zone_name.sql gzip -d /work/bak/mysql__time_zone.sql.gz; mysql -uroot -padmin mysql </work/bak/mysql__time_zone.sql gzip -d /work/bak/mysql__time_zone_transition.sql.gz; mysql -uroot -padmin mysql </work/bak/mysql__time_zone_transition.sql gzip -d /work/bak/mysql__time_zone_transition_type.sql.gz; mysql -uroot -padmin mysql </work/bak/mysql__time_zone_transition_type.sql gzip -d /work/bak/mysql__user.sql.gz; mysql -uroot -padmin mysql </work/bak/mysql__user.sql gzip -d /work/bak/qiuhom_gbk__test_gbk.sql.gz; mysql -uroot -padmin qiuhom_gbk </work/bak/qiuhom_gbk__test_gbk.sql gzip -d /work/bak/qiuhom__test1.sql.gz; mysql -uroot -padmin qiuhom </work/bak/qiuhom__test1.sql gzip -d /work/bak/qiuhom__test2.sql.gz; mysql -uroot -padmin qiuhom </work/bak/qiuhom__test2.sql gzip -d /work/bak/qiuhom__test.sql.gz; mysql -uroot -padmin qiuhom </work/bak/qiuhom__test.sql [root@qiuhom ~]# ls -l /work/bak/|awk '{print $9}'|sed -r 's#(^.*)__(.*).sql.gz#gzip -d /work/bak/\1__\2.sql.gz; mysql -uroot -padmin \1 </work/bak/\1__\2.sql#g'|bash [root@qiuhom ~]# mysql -uroot -padmin -e "use qiuhom;show tables;" +------------------+ | Tables_in_qiuhom | +------------------+ | test | | test1 | | test2 | +------------------+
mysql裏面恢復數據庫
在mysql裏面咱們用source +備份的sql文件還原數據庫。source+備份文件 是必需要登陸mysql後執行的語句,固然也能夠用mysql -e 去執行。
[root@qiuhom ~]# mysql -uroot -padmin -e "show databases;use qiuhom_gbk;select *from test_gbk;" +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | qiuhom | | qiuhom_gbk | +--------------------+ +----+------+ | id | name | +----+------+ | 1 | hh | | 2 | ff | | 3 | xx | +----+------+ [root@qiuhom ~]# mysqldump -uroot -padmin -B qiuhom_gbk --compact > qiuhom_gbk.sql [root@qiuhom ~]# mysql -uroot -padmin Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 534 Server version: 5.5.32-log Source distribution Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | qiuhom | | qiuhom_gbk | +--------------------+ 5 rows in set (0.00 sec) mysql> drop database qiuhom_gbk; Query OK, 1 row affected (0.01 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | qiuhom | +--------------------+ 4 rows in set (0.00 sec) mysql> source qiuhom_gbk.sql Query OK, 1 row affected (0.00 sec) Database changed Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.01 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | qiuhom | | qiuhom_gbk | +--------------------+ 5 rows in set (0.00 sec) mysql> use qiuhom_gbk; Database changed mysql> show tables; +----------------------+ | Tables_in_qiuhom_gbk | +----------------------+ | test_gbk | +----------------------+ 1 row in set (0.00 sec) mysql> select * from test_gbk; +----+------+ | id | name | +----+------+ | 1 | hh | | 2 | ff | | 3 | xx | +----+------+ 3 rows in set (0.00 sec)
固然mysql -e 「source +sql文件」也是能夠的。咱們能夠本身寫sql文件 用source 去執行,好比插入多條數據以不一樣的字符集去插入。
[root@qiuhom ~]# cat test.sql use qiuhom; set names latin1; insert into test(id,name) values(10,'張三'),(11,'李四'); set names gbk; insert into test(id,name) values(14,'王五'),(15,'cbdf'); set names utf8; insert into test(id,name) values(16,'小明'),(17,'小紅'); [root@qiuhom ~]# mysql -uroot -padmin -e "use qiuhom;select * from test;" +----+------+ | id | name | +----+------+ | 1 | a | | 2 | b | | 3 | c | +----+------+ [root@qiuhom ~]# mysql -uroot -padmin -e "source test.sql" [root@qiuhom ~]# mysql -uroot -padmin -e "use qiuhom;select * from test;" +----+----------------+ | id | name | +----+----------------+ | 1 | a | | 2 | b | | 3 | c | | 10 | å¼ ä¸‰ | | 11 | æŽå›› | | 14 | 鐜嬩簲 | | 15 | cbdf | | 16 | 小明 | | 17 | 小紅 | +----+----------------+