数据库备份mysqldump应用总结

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库备份mysqldump应用总结相关的知识,希望对你有一定的参考价值。

[[email protected] ~]# mysqldump -uroot -p123456 xxx > /opt/xxx.sql   #备份数据库xxx
[[email protected] ~]# 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;
[[email protected] ~]# mysqldump -uroot -p123456 xxx --default-character-set=latin1 > /opt/xxx1.sql     #指定字符集导出数据库
[[email protected] ~]# 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;
[[email protected] ~]# mysql -uroot -p123456 -e "use xxx;drop table test;"   删除表test
[[email protected] ~]# mysql -uroot -p123456 -e "use xxx;show tables;"  可以看到test表已经没有了
[[email protected] ~]# 
[[email protected] ~]# 
[[email protected] ~]# mysql -uroot -p123456 xxx < /opt/xxx1.sql   导回数据库
[[email protected] ~]# 
[[email protected] ~]# mysql -uroot -p123456 -e "use xxx;show tables;"   再次查看test表已经有了
+---------------+
| Tables_in_xxx |
+---------------+
| test          |
+---------------+
[[email protected] ~]# 
[[email protected] ~]# mysqldump -uroot -p123456 -B xxx --default-character-set=latin1 > /opt/xxx1_B.sql   加 -B 选项导出
[[email protected] ~]# cd /opt/
[[email protected] 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`;
[[email protected] opt]# mysql -uroot -p123456 -e "drop database xxx;show databases;"      删除数据库xxx               
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
[[email protected] opt]# mysql -uroot -p123456  < /opt/xxx1_B.sql        因为这是加了 -B 选项导出来的数据,所以前面不需要再指定数据库                                       
[[email protected] opt]# mysql -uroot -p123456 -e "show databases;"       可以看到数据库已经恢复了           
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| xxx                |
+--------------------+
[[email protected] opt]# mysqldump -uroot -p123456 -B xxx --default-character-set=latin1|gzip > /opt/xxx1_B.sql.gz   用gzip压缩后再导出
[[email protected] 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语句的形式输出
备份多个库
[[email protected] opt]# mysqldump -uroot -p123456 -B test zabbix | gzip > /opt/mul.sql.gz
[[email protected] opt]# ll
total 4900
-rw-r--r--  1 root root 5012554 Aug 15 07:52 mul.sql.gz
-B 参数是关键,表示连接多个库,并且增加 use db; 和 create database db的信息
[[email protected] opt]# mysql -uroot -p123456 -e "show databases;"|grep -Evi "database|info|perf"
martin
martin_gbk
martin_utf8
mysql
test
zabbix
[[email protected] 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 
[[email protected] opt]# sh mysql.sh 
[[email protected] 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)
备份单个表
[[email protected] opt]# mysqldump -uroot -p123456 martin student > one.sql        
martin指的是库名  student指的是表名   这时候不能加 -B参数了   因为 -B参数会将后面识别的都是库名
备份多个表
[[email protected] opt]# mysqldump -uroot -p123456 martin student student1 > two.sql
martin指的是库名  student student1 指的是两个表名
[[email protected] alertscripts]# mysqldump -uroot -p123456 -d martin student1 
只备份student1  表的结构  martin代表数据库
[[email protected] ~]# mysqldump -uroot -p123456 -A -B --events|gzip > /opt/all.sql.gz   -A代表所有数据库
[[email protected] 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
[[email protected] mysql]# mysqldump -uroot -p123456 -A -B -F --events|gzip > /opt/all.sql.gz   -F 会刷新bin-log
[[email protected] 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
[[email protected] 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 */;
[[email protected] mysql]# mysql -uroot -p123456 -e "show master status\G;"    
*************************** 1. row ***************************
            File: mysql-bin.000008
        Position: 106
[[email protected] 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)


本文出自 “厚德载物” 博客,谢绝转载!

以上是关于数据库备份mysqldump应用总结的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL备份总结

mysqldump备份总结

mysqldump 备份命令使用中的一些经验总结

mysqldump 备份命令使用中的一些经验总结

mysql备份之mysqldump工具

mysqldump完全备份 和 二进制即时点还原数据库