MySQL备份与恢复小记

版权声明:有疑问可加微信15216874307 https://blog.csdn.net/Doudou_Mylove/article/details/82587970

运维就两件事:第一个保护公司的数据;第二个时网站7*24小时提供服务。


逻辑备份:(mysqldump)
物理备份:通过硬盘等介质进行拷贝


参数-e实现非交互式对话


MySQL的备份与恢复
备份:mysqldump -uroot -p db >1.sql
恢复:mysql -uroot -p db <1.sql
只备份一个表:mysqldump -uroot -p db tb1 >2.sql
备份多个库:mysqldump -uroot -p -hlocalhost -P3306 -B db1,db2,db3 >/tmp/123.sql
备份所有库:mysqldump -uroot -p -A >A.sql
备份定时字符集:mysqldump -uroot -p --default-character=utf8 db >1.sql
恢复时也指定字符集:mysql -uroot -p --default-character=gbk db <1.sql    //默认是拉丁1的字符集


备份dept_db库:
mysqldump -uroot -p123456 dept_db >/tmp/mysql_bak.sql
查看备份sql内容:
egrep -v '#|\*|--|^$' /tmp/mysql_bak.sql
恢复dept_db库;
mysql -p123456 dept_db </tmp/mysql_bak.sql

用参数-B备份(推荐):
mysqldump -uroot -p123456 dept_db -B >/tmp/mysql_bak_B.sql
mysqldump -uroot -p123456 dept_db benn -B |gzip >/tmp/mysql_bak_B.sql.gz(gzip压缩备份)
-B 备份恢复方式:
mysql -uroot -p123456 </tmp/mysql_bak_B.sql
-B 参数可以备份多个库,用空格隔开,并且增加use db和create database db的信息;


分库备份:
mysql -uroot -p123456 -e "show databases;" |grep -Evi '(database|infor|test|perfor|mysql)' |sed -r 's#^([a-z].*$)#mysqldump -uroot -p'123456' --events -B \1 |gzip >/opt/\1.sql.gz#g' |bash

可写入脚本:
#!/bin/bash
for dbname in `mysql -uroot -p123456 -e "show databases;" |grep -Evi '(database|infor|test|perfor|mysql)' `
do
    mysqldump -uroot -p'123456' --events -B $dbname |gzip >/opt/${dbname}.sql.gz
done
 

单库多表备份(dept_db库的SC和admin表,这里不用-B):
mysqldump -uroot -p123456 --compact dept_db SC admin >/opt/my_bak.sql
分表备份的缺点:文件多,很碎。
1、备份一个完整备份,再做一个分库分表备份
2、脚本批量恢复多个sql文件。


备份数据库表结构:-d
mysqldump -uroot -p123456 --compact -d dept_db SC admin >/opt/my_bak.sql
只备份表数据:  -t
mysqldump -uroot -p123456 --compact -t dept_db SC admin >/opt/my_bak.sql
--compact
导出更少的输出信息(用于调试)。去掉注释和头尾等结构(线上不推荐用)

全部数据库备份:
mysqldump -uroot -p123456 -A -B --events |gzip >/opt/my_bak.sql.gz
-A  所有数据库
-F  切割binlog日志
mysqldump -uroot -p123456 -A -B -F --events |gzip >/opt/my_bak.sql.gz


--master-data:将二进制的信息写入到输出文件中


--master-data=1
mysqldump -uroot -p123456 --master-data=1 benn >/opt/benn.sql
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000013', MASTER_LOG_POS=93892;


--master-data=2(变成了注释)
mysqldump -uroot -p123456 --master-data=2 benn >/opt/benn2.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000013', MASTER_LOG_POS=93892;


如果选项赋值为2,那么CHANGE MASTER TO 语句会被写成一个SQL comment(注释),从而只提供信息;
如果没有指定,默认值为1。那么语句不会被写成注释并且在dump被载入时生效。


参数小解

-x 锁全部表
-l  锁单表
mysqldump -uroot -p123456 -x >/opt/my_bak.sql.gz
mysqldump -uroot -p123456 -l >/opt/my_bak.sql.gz
备份时锁表可以保证数据一致性,但是锁表就会停止对数据库的所有操作。

--single-transaction参数,适合innodb事务数据库备份
myisam备份命令:
mysqldump -uroot -p123456 -A -B --master-data=2 --events >/opt/my_bak.sql.gz
innodb备份命令(推荐使用):
mysqldump -uroot -p123456 -A -B --master-data=2 --single-transaction --events|gzip >/opt/my_bak.sql.gz
inoodb在备份时,通常启用选项--single-transaction来保证备份的一致性,实际上它的工作原理是设定本次会话的隔离级别为:REPEATABLE READ,
以确保本次会话(dump)时,不会看到其他会话已经提交了的数据。


[root@cent6 work]# mysqlbinlog /data/mysql/mysql-bin.000011
mysqlbinlog: unknown variable 'default-character-set=utf8'
原因是mysqlbinlog这个工具无法识别binlog中的配置中的default-character-set=utf8这个指令。
两个方法可以解决这个问题
一是在MySQL的配置/etc/my.cnf中将default-character-set=utf8 修改为 character-set-server = utf8,
但是这需要重启MySQL服务,如果你的MySQL服务正在忙,那这样的代价会比较大。
二是加上参数--no-defaults

mysqlbinlog --no-defaults mysql-bin.000004


source
恢复数据库(需要进入数据库):
语法:source 后面接上绝对路径sql文件。
实际案例:
备份数据库
数据库名为:fenghuang_db
mysqldump –u root -p fenghuang_db >/root/20171127.sql
把20171127.sql放到/root下
导入数据库
Mysql –uroot –p 密码
新建一个新数据库(要跟以前的数据库名字一样)
create databae fenghuang_db; (创建一个同名数据库 )
use fenghuang_db (使用数据库)
set names utf8; (统一编码,默认不修改)
source /root/20171127.sql

mysql恢复数据库(如果备份时不指定-B参数,恢复的时候一定要指定数据库名):
mysql -uroot -p dept_db </opt/dept_db.sql.gz
如果sql文件时压缩文件需要先解压:
gzip -d dept_db.sql.gz(-d解压,但是此参数会删除源文件)


批量恢复数据库脚本:(这里以-B备份的数据库恢复不用指定数据库名)
#!/bin/bash
cd /opt/
gzip -d *.gz
for dbname in `ls *.sql |sed 's/.sql//g'`
do
    mysql -uroot -p123456  <${dbname}.sql
done

猜你喜欢

转载自blog.csdn.net/Doudou_Mylove/article/details/82587970
今日推荐