Mysql按需备份数据mysql
经过在my.cnf配置bin-log,实现操做日志的记录,并配合mysqldump的全备份来实现全备和按需恢复数据的数据备份方案。
再以实例来讲明方案的实现。
本文章实现单机备份方案,主从备份,后续再补充。
实施环境说明:
--centos:6.5
--mysql5.7.12
注:本文以linux系统下的方案,windows系统可做为参考。linux
##1. 建立备份文件夹sql
按需建立本身的备份文件夹,本方案建立两个文件夹,一个放全备,一个放bin-log日志 全备:/home/databackup/backups 日志:/home/databackup/bin-log
GRANT SELECT,SHOW DATABASES,SHOW VIEW,LOCK TABLES,TRIGGER,RELOAD,REPLICATION CLIENT ON *.* TO 'dumper'@'127.0.0.1' IDENTIFIED BY 'password' WITH GRANT OPTION;FLUSH PRIVILEGES;
受权后续说明数据库
按以下配置my.cnf以后,重启service mysql restart, 在/home/databackup/bin-log文件夹下,会生成msyql-bin.index和mysql-bin.000001。windows
#database backup explicit_defaults_for_timestamp = 1 # server-id = 1 ## binlog存放路径 log-bin=/home/databackup/bin-log/mysql-bin.log ## binlog记录的格式,有row、statement、mixed三种选项 binlog-format = row ## binlog写缓冲区设置大小,因为是内存,写速度很是快,能够有效提升binlog的写效率,若是数据库>中常常出现大事务,能够酌情提升该参数。 binlog_cache_size = 32m ## 最大缓存区大小 max_binlog_cache_size = 512m ## binlog文件最大的大小 max_binlog_size = 1000m ## 二进制日志自动删除的天数。默认值为0,表示“没有自动删除” expire_logs_days = 60 ## 须要备份的数据库名,若是备份多个数据库,重复设置这个选项便可 binlog-do-db = databaseName1 binlog-do-db = databaseName2 ...... ## 不须要备份的数据库,若是备份多个数据库,重复设置这个选项便可 binlog-ignore-db = databaseName1 binlog-ignore-db = databaseName2 ......
建立备份脚本,文件名为mysql-databackup.sh,内容以下:centos
## !/bin/ash ## mysql-databackup.sh # Database info B_USER="dumper" DB_PASS="Dum#Per2017!" DB_HOST="127.0.0.1" # Database array DB_NAME=("power_organization") # Others vars BIN_DIR="/home/databackup/bin-log" #the mysql bin path BCK_DIR="/home/databackup/backups" #the backup file directory DATE=`date +%F` # create file mkdir $BCK_DIR/$DATE # TODO # /usr/bin/mysqldump --opt -ubatsing -pbatsingpw -hlocalhost timepusher > /mnt/mysqlBackup/db_`date +%F`.sql for var in ${DB_NAME[@]}; do mysqldump --opt -uuser -ppassword -h$DB_HOST --single-transaction --flush-logs --master-data=2 $var | gzip > $BCK_DIR/$DATE/$var.sql.gz done # 删除10天以前的备份文件 find /home/databackup/backups -mtime +10 -name "*.*" -exec rm -Rf {} \;
crontab -e内容缓存
0 3 * * * /home/databackup/mysql-databackup.sh
建立实例数据库test,并随意插入几条数据。并 登陆mysql执行flush logs,生成新日志mysql-bin.000002编码
msyql>flush log;
mysql> show variables like '%log_bin%';
首先对test数据库作一个完整备份:rest
$ mysqldump -hlocalhost -uuser -ppassword --flush-logs -P3306 --master-data=2 --single-transaction --opt test > test_bak_full.sql
这时候就会获得一个全备文件test.sql日志
a. 在test库的某个表插入一些数据,而后执行flush logs命令。这时将会产生一个新的二进制日志文件mysql-bin.000004,mysql-bin.000004则保存了全备事后的全部更改,既增长记录的操做也保存在了mysql-bin.00004中。
b. 再在test库中的t_user表中增长两条记录,而后误删除t_user任意记录。t_user中增长记录的操做和删除表的操做都记录在mysql-bin.000005中。
$ mysqldump -hlocalhost -uuser -ppassword --flush-logs -P3306 --master-data=2 --single-transaction --opt test > test_bak_full2.sql
mysql > set sql_log_bin=0;
首先导入全备数据
$ mysql -hlocalhost -uuser -ppassword < test_bak_full2.sql
此时数据库恢复到删除前的数据,test数据库恢复
查看当前所在二进制日志中的位置:
mysql> show master status;
会显示最新的日志记录mysql-bin.000007
mysql> show binlog events in 'mysql-bin.000007';
根据上面命令的记录能够查看固然日志的位置position。
恢复数据
也能够经过命令mysqlbinlog查看日志明细,能大概肯定须要完整恢复哪几个binlog文件。
若是知道误操做的命令如DROP TABLE,则能够经过下面的方法在binlog文件中找到误操做以前的那个或那位置段/时间段。
position: (以下面的信息显示,误操做DROP TABLE以前的pos是775,在datetime 141204 15:08:04或pos 882时完成DROP TABLE操做) $ mysqlbinlog /var/lib/mysql/mysql-bin.000003 |grep -C 5 'DROP TABLE' #141204 15:07:05 server id 1 end_log_pos 775 Xid = 376 COMMIT/*!*/; # at 775 #141204 15:08:04 server id 1 end_log_pos 882 Query thread_id=10 exec_time=0 error_code=0 SET TIMESTAMP=1417676884/*!*/; DROP TABLE `t_user` /* generated by server */ /*!*/; # at 882
根据记录,可选择mysql-bin.000005进行恢复,使用mysqlbinlog来查看恢复到什么位置。
这个日志中包括了新增记录和误删表两个部分,咱们须要恢复到新增记录以后、误删操做之前的位置。
如下是恢复命令:
msyqlbinlog mysql-bin.000005 --start-position --stop-position | msyql -hlocalhost -uuser -ppassword
或
mysqlbinlog mysql-bin.000005 --start-datetime=775 --stop-datetime | mysql -h localhost -uroot -p
或
mysqlbinlog mysql-bin.000005 --start-datetime=775 --stop-datetime | restore.sql
而后执行restore.sql来恢复数据
注:在待恢复的position或时间点之前、全备之后的binlog须要所有恢复,多个文件以空格隔开
mysql > set sql_log_bin=1;
unknown variable 'default-character-set=utf8'
在使用mysqlbinlog查看二进制日志的时候,提示下面的错误:
/usr/local/mysql/bin/mysqlbinlog: unknown variable 'default-character-set=utf8'
缘由是在为了统一mysql客户端到服务端的的字符编码,在/etc/my.cnf文件的[client]、[mysqld]等节加入了default-character-set = utf8,mysqlbinlog会从my.cnf中的[client]读取配置,但奈何mysqlbinlog并不认识这个选项(听说是个bug)致使的。
应对这个bug的方法有两个:第一,天然是注释到[client]中的这个字符集配置;第二,改用loose-default-character-set = utf8。在选项前加了loose-,表示当程序不认识此选项时会略过此选项,并给出一个警告。