MySQL与SqlServer备份有区别,以下以MySql为例。
导出的文件有两种,一种为数据文件,包括csv、txt、xml、json、dbf文件等,直接记录了数据。另一种为SQL脚本文件,内容为可执行的sql语句,执行后生成数据。通常使用后者。
二进制日志 binlog
主要用于数据库的主从复制(master开启binlog,传递给slave)和增量备份(mysqlbinlog,用于实现基于时间点的数据恢复 )。
开启后即实现了增量备份,会产生约1%的性能损耗。
如无主从关系且仅做全量备份,则可以不开启。
- 二进制日志索引文件
文件名后缀为.index
,用于记录所有的二进制文件 - 二进制日志文件
文件名后缀为.00000*
,以事务形式记录数据库所有非查询的操作语句。
每条记录是从一个【at 数字】开始到一个【at 数字】结束,之间是一条二进制日志记录。每条记录的end_log_pos值与记录结束的at后的值是一致的。
落盘频次
通过sync_binlog
配置binlog落盘的时机
通常配置为0或100,牺牲一定的一致性获取更好的性能。
- 0,表示MySQL不控制binlog的刷新,由文件系统去控制它缓存的刷新。
- 正整数,表示每sync_binlog次事务后,保存binlog到磁盘。
其中,默认值1最安全,即系统故障时最多丢失一个事务的更新。
开启binlog
- 查看binlog状态,其中 log_bin 为 OFF 则表示未开启
show variables like 'log_bin';
select @@log_bin;
show variables like '%binlog%';
- 修改配置文件,重启mysql使配置生效
- Windows:
mysql/my.ini
- Linux:根据系统环境和mysql版本不同,配置文件可能不同。
/etc/my.cnf
或/etc/mysql/my.cnf
或/etc/mysql/mysql.cnf
,或其中指向了另一个配置文件,如/etc/mysql/mysql.conf.d/mysqld.cnf
# 必要配置
server-id = 1 # 【当前机器的服务 ID(如果是集群,则不能重复)】
log_bin = /var/log/mysql/mysql-bin # 【开启binlog并配置日志存放路径】
# 其他配置
binlog_format = MIXED #【设置日志格式,主从复制时建议使用 ROW 或 MIXED】
# 【在ROW/MIXED模式下,除了数据变化,也在注释中记录SQL。默认为0不记录SQL】
binlog-rows-query-log_events=1
# 【一般不记录mysql库,用户名和密码信息在mysql数据库中】
binlog-ignore-db=mysql
binlog-ignore-db=sys
# 【设置binlog清理时间】
expire_logs_days = 7
# 【设置binlog每个日志文件的最大大小(事务不会跨文件记录,因此可能会超过该值)】
max_binlog_size = 100m
# 【设置binlog缓存大小】
binlog_cache_size = 4m
# 【最大binlog缓存大小,多语句事务所有session内存相加的最大值】
max_binlog_cache_size = 512m
binlog_format
- STATMENT
基于SQL语句的复制,只记录语句,不记录值,体积较小。
但相同语句在不同的环境可能有不同结果,不应在主从复制时使用。 - ROW
基于行的复制,只记录修改前后的值(前镜像、后镜像),不记录语句,可靠性高。
即使只修改了某个字段,也会记录整个行,因此体积较大。- binlog_row_image 默认为FULL,前后镜像都记录整行。可以通过改为 MINIMAL 只记录列以压缩体积,但会导致无法canal和闪回(flashback),不建议使用。
- binlog-rows-query-log_events 默认为0,不记录SQL日志。如改为1,则在注释中通过Rows Query Event记录SQL日志。通过mysqlbinlog查看时需要使用参数
-vv
- MIXED
混合格式,默认采用STATMENT,对STATEMENT可能无法精确复制的内容采用ROW。因此上述ROW的相关参数也能对MIXED生效。
查看binlog
show master logs;
show binary logs;
show binlog events;
show master status;
show slave status;#查看作为从机的状态
- 通过
mysqlbinlog
将binlog文件转成SQL语句预览或导出
其中ROW格式的日志无法转化为SQL语句,可通过-v
参数转化为类SQL语句注释
mysqlbinlog /var/lib/mysql/mysql-bin.000002
mysqlbinlog -v --start-position=509 --stop-postion=845 /var/lib/mysql/mysql-bin.000001
mysqlbinlog -d 数据库名称 日志文件名
mysqlbinlog -r 日志文件名 文本文件名;
mysqlbinlog 日志文件名 > 文本文件名;
刷新binlog
结束当前binlog日志,创建新日志文件记录后续改动。
flush logs;
使用语句导入、导出
导出数据(全量备份)
生成一个.sql
脚本,其中包含了创建数据的指令
mysqldump -u 用户名 -p 密码 数据库名 表名 > 保存路径
mysqldump -uroot -p123456 -A -F -R --events --single-transaction --master-data=2 | gzip > /data_bak/db_bak_000001.sql.gz
- 无密码则
-p
后不加内容即可 - 如需远程备份,通过
-h
和-P
指定IP地址和端口号 - 如需压缩,则在
>
前加入| gzip
,如| gzip > /db_bak.sql.gz
- 如需备份整个数据库,则不填表名
- 如需备份所有数据库,则用参数
--all-databases
或-A
代替数据库名 - 如需备份多个数据库,则用参数
--databases
或-B
,其后多个数据库名以空格分隔 - 如需备份多个表,则用参数
--tables
,其后多个表名以空格分隔
mysqldump -uroot -p --databases wgx hist > /tmp/d1d2.sql
-
--flush-logs
或-F
:结束当前binlog日志,创建新日志文件记录后续改动。 -
--quick
或-q
:(默认已开启),从服务器查询取得记录直接输出而不是取得所有记录后将它们缓存到内存中。 -
--routines
或-R
:备份存储过程和自定义函数 -
--events
:导出事件 -
--single-transaction
:用于事务表(InnoDB),保证一致性
本质上是设置本次会话为repeatable read -
--lock-all-tables
或-x
:用于非事务表(MyISAM),保证一致性 -
--master-data=2
:在导出的SQL文件中,生成当时的binlog文件名及其Position的注释 -
--no-data
:只导出表结构,不导出数据 -
--where
或-w
:数据筛选条件
导入数据(全量恢复)
# 直接导入
mysql -u 用户名 -p 密码 数据库名 表名 < 来源文件
# 也可以进入mysql命令行后导入:
source /data_bak/13.sql;
# 也可以在外直接使用mysql命令行导入:
mysql -uroot -p123456 -e "source /data_bak/13.sql;"
导入数据(全量恢复 + 增量恢复)
- 执行
flush logs;
创建新的binlog文件。 - 找到上次备份产生的
.sql
文件。 - 找到步骤2文件中,因
–master-data=2
记录的对应binlog文件(如 -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000012', MASTER_LOG_POS=154; ),并将其及其之后的所有binlog文件(不包括步骤1中新建的文件)都拷贝到其他目录进行备份。 - 通过
mysqlbinlog -v
预览步骤3中文件,在其中找到需要备份位置的Position - 对步骤2中文件进行全量恢复
mysql -uroot -p123456 < /data_bak/db_bak_2020-07-04.sql
- 将步骤3中文件转为SQL,直到步骤4中Position,并执行以实现增量恢复
mysqlbinlog --stop-position=2397 /var/lib/mysql/mysql-bin.000012 > /data_bak/12.sql
mysqlbinlog /var/lib/mysql/mysql-bin.000013 > /data_bak/13.sql
mysql -uroot -p123456 < /data_bak/12.sql
mysql -uroot -p123456 < /data_bak/13.sql
恢复数据(flashback 闪回)
通过将binlog内容全部取反,直接进行相反的SQL指令以实现数据恢复,比全量恢复 + 增量恢复方案更快捷高效。
仅在binlog_format=ROW
且binlog_row_image=FULL
时可用。
通常通过FlashBack或MyFlash工具实现。
案例一:编写一个mysqldump分表备份脚本
>vim backup_tables.sh
#!/bin/bash
#利用for循环取出数据库中所有的表名称,并过滤掉标题行
for tablename in `mysql -uroot -p123456 hist -e "show tables;"|grep -Evi "table"`
do
# 针对每个表名称生成相应的mysqldump命令
mysqldump -uroot -p123456 --events hist $tablename|gzip > /tmp/${tablename}_bak.sql.gz
done
>chmod +x backup_tables.sh
>ll
>./backup_tables.sh
案例二:Linux使用crontab定时备份并上传OSS(windows则用任务计划)
cron有两个配置文件,一个是全局配置文件(/etc/crontab
),一个是每个用户通过crontab -e
直接操作的配置文件(/var/spool/cron/当前用户名
)
- 查看配置文件:
crontab -l
- 编辑配置文件(vim):
crontab -e
或直接编辑配置文件
配置文件内容:如0 3 * * * sh /www/ql_backend_pro/backup/backup.sh
,表示每年每月每日03:00用shell执行backup.sh
文件(shell文件必须以#!/bin/bash
开头) - crontab 的执行记录会写入到
/var/log/cron
,以帐号为区分 - 使用ossutil64工具保存到OSS较为方便。
此外也可以使用scp命令保存到其他服务器。注意配置ssh免密钥登录,否则无法作为脚本自动执行。
#!/bin/bash
#保存备份个数,备份31天数据
number=31
#备份保存路径
backup_dir=/www/ql_backend_pro/backup
#日期
dd=`date +%Y-%m-%d-%H-%M-%S`
#备份工具
tool=mysqldump
#用户名
username=root
#密码
password=vl1qaz@WSX
#将要备份的数据库
database_name=chinaduancai_pro
#如果文件夹不存在则创建
if [ ! -d $backup_dir ];
then
mkdir -p $backup_dir;
fi
$tool -u $username -p$password $database_name > $backup_dir/$database_name-$dd.sql
# 备份到OSS
/www/ossutil64 cp $backup_dir/$database_name-$dd.sql oss://chinaduancai-backup/sql/
#写创建备份日志
echo "create $backup_dir/$database_name-$dd.sql" >> $backup_dir/log.txt
#找出需要删除的备份
delfile=`ls -l -crt $backup_dir/*.sql | awk '{print $9 }' | head -1`
#判断现在的备份数量是否大于$number
count=`ls -l -crt $backup_dir/*.sql | awk '{print $9 }' | wc -l`
if [ $count -gt $number ]
then
#删除最早生成的备份,只保留number数量的备份
rm $delfile
#写删除文件日志
echo "delete $delfile" >> $backup_dir/log.txt
fi
使用Navicat进行本地导入、导出和备份
注意,Navicat的导出和备份都只能保存在本地
从本地导入
右击数据库,选择“运行SQL文件”
导出到本地
右击数据库,选择“转储SQL文件”
或选中表,选择“导入”或“导出”(可用于导出搜索结果或临时表)
备份到本地
选择数据库-备份-新建备份-备份(备份文件位于编辑连接-高级-设置位置
中)
在最后一步不选择备份,而选择保存,可以保存为一个自定义备份配置文件,供批处理任务调用
通过批处理作业定时备份到本地
本质上是用了windows的任务计划,无需navicat保持连接,但需要开机状态
创建一个批处理作业
选择数据库-自动运行-新建批处理作业-保存
可通过设置触发器
来设置自动执行的时间为批处理作业添加任务
选中批处理作业-备份-选择数据库-选择可用的工作-保存
可用的工作默认备份整个数据库,也可以在新建备份
时创建自定义备份配置文件,在此处可选择