首页 / MYSQL / mysql数据库备份与恢复
mysql数据库备份与恢复
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql数据库备份与恢复,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含18663字,纯文字阅读大概需要27分钟。
内容图文
1.mysqldump 逻辑备份mysql数据库。
mysqldump的原理:mysqldump命令备份数据的过程,实际上就是把数据从mysql库里以逻辑的sql语句的形式直接输出或者生成备份文件的过程。
语法:mysqldump -u用户名 -p密码 要备份的数据库名 [要备份的表名] > 备份文件名
--compact 优化备份文件大小减少输出注释,主要用于debug调试
[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这些参数的信息就不会给出。所以我们用于debug调试。整数环境还是不要用这个参数
-B 指定数据库,可以多个数据库,注意-B参数后面全部是接的库名,不能跟表名。
1.01备份多个库
mysqldump -uroot -padmin -B 库1 库2 库3 > /work/bak/xxx.sql
[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.sql
[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 -B备份数据库里的所有库的内容,需要注意的是-B后面不能接库名
mysqldump -uroot -padmin -A -B --events >/work/bak/xxx.sql
[root@qiuhom bak]# mysqldump -uroot -padmin --compact -A -B qiuhom>/work/bak/qiuhom__test.sql [root@qiuhom bak]# cat qiuhom__test.sql Usage: mysqldump [OPTIONS] database [tables] OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...] OR mysqldump [OPTIONS] --all-databases [OPTIONS] For more options, use mysqldump --help [root@qiuhom bak]# mysqldump -uroot -padmin --compact -A -B >/work/bak/qiuhom__test.sql -- Warning: Skipping the data of table mysql.event. Specify the --events option explicitly. [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参数 -B后面不能接库名 否则备份失败,一定要注意这个问题。。
-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的日子文件,记录着你操作数据库的所有日志,这个文件相当重要,对恢复数据有很大的帮助,所有一般情况我们都是把他给开启的。开启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后面紧接着就是file和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}'|awk -F "." '{print $1}'|grep -Ev "^$"` ###分离相同库里的各个表 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
内容总结
以上是互联网集市为您收集整理的mysql数据库备份与恢复全部内容,希望文章能够帮你解决mysql数据库备份与恢复所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。