标签:mysql mysqlbinlog mysqldump 数据库备份 恢复
[root@ansible ~]# mysqldump -uroot -p123456 xxx > /opt/xxx.sql #备份数据库xxx [root@ansible ~]# egrep -v "#|\*|--|^$" /opt/xxx.sql DROP TABLE IF EXISTS `test`; CREATE TABLE `test` ( `id` int(4) NOT NULL AUTO_INCREMENT, `name` char(20) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1; LOCK TABLES `test` WRITE; INSERT INTO `test` VALUES (1,‘martin‘),(2,‘martin‘),(3,‘tom‘),(4,‘marry‘),(5,‘jacky‘),(6,‘脗铆‘); UNLOCK TABLES; [root@ansible ~]# mysqldump -uroot -p123456 xxx --default-character-set=latin1 > /opt/xxx1.sql #指定字符集导出数据库 [root@ansible ~]# egrep -v "#|\*|--|^$" /opt/xxx1.sql DROP TABLE IF EXISTS `test`; CREATE TABLE `test` ( `id` int(4) NOT NULL AUTO_INCREMENT, `name` char(20) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1; LOCK TABLES `test` WRITE; INSERT INTO `test` VALUES (1,‘martin‘),(2,‘martin‘),(3,‘tom‘),(4,‘marry‘),(5,‘jacky‘),(6,‘马‘); 可以看到乱码已经不存在了,建表默认是latin1 UNLOCK TABLES; [root@ansible ~]# mysql -uroot -p123456 -e "use xxx;drop table test;" 删除表test [root@ansible ~]# mysql -uroot -p123456 -e "use xxx;show tables;" 可以看到test表已经没有了 [root@ansible ~]# [root@ansible ~]# [root@ansible ~]# mysql -uroot -p123456 xxx < /opt/xxx1.sql 导回数据库 [root@ansible ~]# [root@ansible ~]# mysql -uroot -p123456 -e "use xxx;show tables;" 再次查看test表已经有了 +---------------+ | Tables_in_xxx | +---------------+ | test | +---------------+ [root@ansible ~]# [root@ansible ~]# mysqldump -uroot -p123456 -B xxx --default-character-set=latin1 > /opt/xxx1_B.sql 加 -B 选项导出 [root@ansible ~]# cd /opt/ [root@ansible opt]# diff xxx1.sql xxx1_B.sql 对比没有加 -B选项 和加 -B选项时候的区别 18a19,26 > -- Current Database: `xxx` > -- > > CREATE DATABASE /*!32312 IF NOT EXISTS*/ `xxx` /*!40100 DEFAULT CHARACTER SET latin1 */; > > USE `xxx`; > > -- 51c59 < -- Dump completed on 2016-08-13 23:07:34 --- > -- Dump completed on 2016-08-13 23:17:33 说明:直观看 加了 -B 参数的作用是在导出数据库的时候增加了 创建数据库和连接数据库的命令了,即如下两条语句 CREATE DATABASE /*!32312 IF NOT EXISTS*/ `xxx` /*!40100 DEFAULT CHARACTER SET latin1 */; USE `xxx`; [root@ansible opt]# mysql -uroot -p123456 -e "drop database xxx;show databases;" 删除数据库xxx +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+ [root@ansible opt]# mysql -uroot -p123456 < /opt/xxx1_B.sql 因为这是加了 -B 选项导出来的数据,所以前面不需要再指定数据库 [root@ansible opt]# mysql -uroot -p123456 -e "show databases;" 可以看到数据库已经恢复了 +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | | xxx | +--------------------+ [root@ansible opt]# mysqldump -uroot -p123456 -B xxx --default-character-set=latin1|gzip > /opt/xxx1_B.sql.gz 用gzip压缩后再导出 [root@ansible opt]# ll -rw-r--r-- 1 root root 2069 Aug 13 23:17 xxx1_B.sql -rw-r--r-- 1 root root 805 Aug 13 23:33 xxx1_B.sql.gz 可以看到压缩后导出的数据大小 小了很多 总结: 1、导出数据用-B参数 2、用gzip对备份的数据压缩 mysqldump 的工作原理 利用mysqldump命令备份数据的过程,实际上就是把数据从mysql库里面以逻辑的sql语句的形式输出 备份多个库 [root@centos02 opt]# mysqldump -uroot -p123456 -B test zabbix | gzip > /opt/mul.sql.gz [root@centos02 opt]# ll total 4900 -rw-r--r-- 1 root root 5012554 Aug 15 07:52 mul.sql.gz -B 参数是关键,表示连接多个库,并且增加 use db; 和 create database db的信息 [root@centos02 opt]# mysql -uroot -p123456 -e "show databases;"|grep -Evi "database|info|perf" martin martin_gbk martin_utf8 mysql test zabbix [root@centos02 opt]# cat mysql.sh #备份数据库多个库的脚本 #!/bin/bash for dbname in `mysql -uroot -p123456 -e "show databases;"|grep -Evi "database|info|perf"` do mysqldump -uroot -p123456 --events -B ${dbname}|gzip > /opt/${dbname}.sql.gz done [root@centos02 opt]# sh mysql.sh [root@centos02 opt]# ll -h total 5.1M -rw-r--r-- 1 root root 549 Aug 15 08:34 martin_gbk.sql.gz -rw-r--r-- 1 root root 845 Aug 15 08:34 martin.sql.gz -rw-r--r-- 1 root root 547 Aug 15 08:34 martin_utf8.sql.gz -rw-r--r-- 1 root root 199 Aug 15 08:34 mysql.sh -rw-r--r-- 1 root root 149K Aug 15 08:34 mysql.sql.gz -rw-r--r-- 1 root root 545 Aug 15 08:34 test.sql.gz -rw-r--r-- 1 root root 4.9M Aug 15 08:34 zabbix.sql.gz mysql> use martin; Database changed mysql> show tables; +------------------+ | Tables_in_martin | +------------------+ | student | | student1 | +------------------+ 2 rows in set (0.00 sec) 备份单个表 [root@centos02 opt]# mysqldump -uroot -p123456 martin student > one.sql martin指的是库名 student指的是表名 这时候不能加 -B参数了 因为 -B参数会将后面识别的都是库名 备份多个表 [root@centos02 opt]# mysqldump -uroot -p123456 martin student student1 > two.sql martin指的是库名 student student1 指的是两个表名 [root@centos02 alertscripts]# mysqldump -uroot -p123456 -d martin student1 只备份student1 表的结构 martin代表数据库 [root@localhost ~]# mysqldump -uroot -p123456 -A -B --events|gzip > /opt/all.sql.gz -A代表所有数据库 [root@localhost mysql]# ll -rw-rw---- 1 mysql mysql 236 Aug 11 23:14 mysql-bin.000001 -rw-rw---- 1 mysql mysql 488 Aug 12 00:51 mysql-bin.000002 -rw-rw---- 1 mysql mysql 722 Aug 12 23:46 mysql-bin.000003 -rw-rw---- 1 mysql mysql 229 Aug 13 01:06 mysql-bin.000004 -rw-rw---- 1 mysql mysql 244 Aug 17 14:41 mysql-bin.000005 -rw-rw---- 1 mysql mysql 95 Aug 17 14:41 mysql-bin.index [root@localhost mysql]# mysqldump -uroot -p123456 -A -B -F --events|gzip > /opt/all.sql.gz -F 会刷新bin-log [root@localhost mysql]# ll -rw-rw---- 1 mysql mysql 236 Aug 11 23:14 mysql-bin.000001 -rw-rw---- 1 mysql mysql 488 Aug 12 00:51 mysql-bin.000002 -rw-rw---- 1 mysql mysql 722 Aug 12 23:46 mysql-bin.000003 -rw-rw---- 1 mysql mysql 229 Aug 13 01:06 mysql-bin.000004 -rw-rw---- 1 mysql mysql 287 Aug 17 14:50 mysql-bin.000005 -rw-rw---- 1 mysql mysql 149 Aug 17 14:50 mysql-bin.000006 -rw-rw---- 1 mysql mysql 149 Aug 17 14:50 mysql-bin.000007 -rw-rw---- 1 mysql mysql 106 Aug 17 14:50 mysql-bin.000008 -rw-rw---- 1 mysql mysql 152 Aug 17 14:50 mysql-bin.index [root@localhost mysql]# mysqldump -uroot -p123456 --master-data=1 --compact martin #--master-data=1 该参数会找bin-log位置 CHANGE MASTER TO MASTER_LOG_FILE=‘mysql-bin.000008‘, MASTER_LOG_POS=106; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; [root@localhost mysql]# mysql -uroot -p123456 -e "show master status\G;" *************************** 1. row *************************** File: mysql-bin.000008 Position: 106 [root@localhost mysql]# mysqldump -uroot -p123456 --master-data=2 --compact martin #--master-data=2 该参数会找bin-log位置,但是语句被注释,实际并不执行 --CHANGE MASTER TO MASTER_LOG_FILE=‘mysql-bin.000008‘, MASTER_LOG_POS=106; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */;
mysqldump的关键参数说明
1、-B 指定多个库,会增加建库语句和use语句
2、--compact 去掉注释,适合调试输出 生产环境不用
3、-A 备份所有库
4、-F 刷新binlog日志
5、--master-data=1 增加binglog日志文件名及对应的位置点
6、-x 锁表
7、-l 只读锁表
8、-d 只备份表结构
9、-t 只备份数据
10、--single-transaction 适合innodb事务数据库备份
生产场景myisam备份: mysqldump -uroot -p123456 -A -B --master-data=1 -x --events|gzip > /opt/all.sql.gz 生产场景innodb备份: mysqldump -uroot -p123456 -A -B --master-data=1 --events --single-transaction|gzip > /opt/all.sql.gz 数据库的恢复 mysql> drop database xxx; Query OK, 1 row affected (0.07 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+ 4 rows in set (0.00 sec) mysql> system ls /opt rh xxx1_B.sql xxx1_B.sql.gz xxx1.sql xxx.sql mysql> source /opt/xxx1_B.sql #用source命令恢复数据库 mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | | xxx | +--------------------+ 5 rows in set (0.00 sec)
本文出自 “厚德载物” 博客,谢绝转载!
标签:mysql mysqlbinlog mysqldump 数据库备份 恢复
原文地址:http://huaxin.blog.51cto.com/903026/1846224