MySQL数据库的备份和恢复
运维的意义: 公司的数据和7*24时的网站服务
数据中数据库一般是核心
mysqldump 逻辑备份单个(多个)数据库练习多种参数使用
mysqldump是mysql自带的一个命令
mysqldump -u username -p 数据库名 > 备份的文件名.sql
mysqldump的备份原理
过程就是把数据从库里面以逻辑sql语句的形式直接导出会加入一些锁表写入的语句!
mysql恢复的原理
把备份的sql语句在数据库中重新执行一遍
举例1: 备份oldboy库
mysqldump -uroot -p12qwaszx -S /data/3307/mysql.sock oldboy > /tmp/oldboy.sql
参看具体内容
[root@log_server ~]# egrep -v "#|\*|--|^$" /tmp/oldboy.sql DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `id` int(4) NOT NULL AUTO_INCREMENT, `name` char(20) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1; LOCK TABLES `student` WRITE; INSERT INTO `student` VALUES (1,'jack'),(2,'????'),(3,'盲赂颅忙∶ヂヂ
根据查看结果可知备份的数据库都是一些DDL和DML sql语句
mysql -uroot -p12qwaszx -S /data/3307/mysql.sock -e "drop table oldboy.student"
恢复:
mysql -uroot -p12qwaszx -S /data/3307/mysql.sock oldboy < /tmp/oldboy.sql
举例2:备份时加-B 参数
mysqldump -uroot -p12qwaszx -B -S /data/3307/mysql.sock oldboy > /tmp/oldboy_bak_B.sql
比较和前面的备份差异
[root@log_server ~]# diff /tmp/oldboy*
19,26d18 < -- Current Database: `oldboy` < -- < < CREATE DATABASE /*!32312 IF NOT EXISTS*/ `oldboy` /*!40100 DEFAULT CHARACTER SET latin1 */; < < USE `oldboy`; < < -- 59c51 < -- Dump completed on 2016-04-10 9:15:44 --- > -- Dump completed on 2016-04-10 8:58:52
提示:直观看加-B备份库 会在备份的时候会加上创建库和切换库的语句
[root@log_server ~]# mysqldump -uroot -p12qwaszx -B -S /data/3307/mysql.sock oldboy > /tmp/oldboy_bak_B.sql [root@log_server ~]# mysql -uroot -p12qwaszx -S /data/3307/mysql.sock -e "drop database oldboy";
恢复:
[root@log_server ~]# mysql -uroot -p12qwaszx -S /data/3307/mysql.sock < /tmp/oldboy_bak_B.sql [root@log_server ~]#
举例3:gzip压缩 mysql数据都是文本所以压缩效率高
mysqldump -uroot -p12qwaszx -B -S /data/3307/mysql.sock oldboy | gzip > /tmp/oldboy_bak_B.sql.gz
比较
[root@log_server ~]# ls -l /tmp/oldboy_bak_B.sql* -rw-r--r-- 1 root root 2123 Apr 10 09:28 /tmp/oldboy_bak_B.sql -rw-r--r-- 1 root root 859 Apr 10 09:28 /tmp/oldboy_bak_B.sql.gz [root@log_server ~]#
举例4:-B 备份多个库
mysqldump -uroot -p12qwaszx -B -S /data/3307/mysql.sock oldboy mysql > /tmp/mult_B.sql
举例5: 分库备份
方法1
mysql -uroot -p12qwaszx -S /data/3307/mysql.sock -e 'show databases' | egrep -v "info|per|tes|Data" | sed -r 's#^([a-Z].*$)#mysqldump -uroot -p12qwaszx --events -S /data/3307/mysql.sock -B \1 | gzip > /tmp/\1.sql.gz#g ' | bash
方法2:
for 循环
举例6: 单表 多表进行备份(思考如何进行分库分表进行备份 命令为表名_bak.sql)
mysql -uroot -p密码 库名 表名1 表名2
查看简要内容:
mysqldump -uroot -p12qwaszx -S /data/3307/mysql.sock --compact mysql user
备份语句
mysqldump -uroot -p12qwaszx -S /data/3307/mysql.sock mysql user > /tmp/user.sql
恢复
mysql -uroot -p12qwaszx -S /data/3307/mysql.sock oldboy < /tmp/user.sql
举例7: 只备份表结构或者表数据
-d 备份表结构
mysqldump -uroot -p密码 -d 库名 表名
-t 备份表数据
mysqldump -uroot -p密码 -t 库名 表名
[root@log_server ~]# mysqldump -uroot -p12qwaszx -S /data/3307/mysql.sock oldboy student --compact -t INSERT INTO `student` VALUES (1,'jack'),(2,'????'),(3,'盲赂颅忙);
举例8: 备份的同时刷新binlog
-F
--master-data=1 增加binlog日志文件名和对应的位置点
mysqldump -uroot -p12qwaszx -S /data/3307/mysql.sock -F oldboy
结论:
1 备份加上-B 参数
2 用gzip对备份的数据压缩 效率更高
3 -B 参数 连接多个数据库备份语句中加入create 数据库和use 数据库
4 一般是分库备份一个库一条备份语句 备份的文件名为:库名_bak.sql
5 一般都是单表备份但缺点是量大一般用途是导入其他人那将单个表
6 备份--compact参数一般不用是个鸡肋参数,适合调试的输出形式,生产场景不用
Use of --compact is the same as specifying --skip-add-drop-table, --skip-add-locks, --skip-comments, --skip-disable-keys, and --skip-set-charset options.
7 -A 备份所有库
8 -x 锁定所有的表 --lock-all-tables
9 --single-transaction 适合innodb事务数据库备份
innodb表在备份时,通常启用选项 --single-transaction 来保证备份的一致性,实际工作原理是设定本次会话的隔离级别为: REPEATABLE READ, 已确定本次会话dump时,不会看到其他会话已经提交了的数据
生产环境运维DBA的备份命令:
myisam备份命令
mysql
mysqldump -uroot -p12qwaszx -S /data/3307/mysql.sock oldboy -B--events -F --master-data=1 -x
innodb
mysqldump -uroot -p12qwaszx -S /data/3307/mysql.sock oldboy -B --events -F --master-data=1 --single-transaction