您好,欢迎访问一九零五行业门户网

MySQL中binlog怎么备份脚本

关于mysql的二进制日志(binlog),我们都知道二进制日志(binlog)非常重要,尤其当你需要point to point灾难恢复的时侯,所以我们要对其进行备份。关于二进制日志(binlog)的备份,可以基于flush logs方式先切换binlog,然后拷贝&压缩到到远程服务器或本地服务器的其他存储上,例如挂载的nas存储,也可以使用mysqlbinlog实现binlog的备份,可以实现mysql二进制日志(binlog)的本地备份或远程备份。最终将mysql二进制日志(binlog)备份文件存储到磁带上。各个公司的备份策略或备份工具有所不同,这里不做展开,我们主要考虑mysql二进制日志(binlog)备份方案/策略尽可能尽善尽美,在一些极端情况下少丢失数据。例如,第一种方式,这种备份方式都是周期性的,如果在某个周期中,遇到一些极端情况,例如服务器宕机了,硬盘损坏了,就可能导致这段时间的binlog丢失了。而且这个周期时间太长,二进制日志(binlog)丢失的风险就越大,如果这个周期太短,频繁切换binlog也不好。所以还是使用mysqlbinlog来备份二进制日志(binlog),这里主要介绍一下我写的mysql二进制日志的备份脚本,这个脚本参考了如何远程备份mysql binlog[1]中的脚本,但是在其基础上做了很多改进和完善:
参考资料中的脚本由于使用了循环操作,不适合在作业中调用。一般需要手工执行脚本,让其在后台运行。遇到服务器重启或其他异常情况,此脚本可能出现未能执行的情况。
增加了mysql_binlog_backup_job.sh脚本,作业会定期调用此脚本,此脚本会判断mysqlbinlog是否还在执行二进制日志备份。即使遇到了数据库服务器重启等情况,备份mysql的二进制日志(binlog)也不会成为问题。
不用手工指定第一个binlog文件参数,采用从数据库读取binlog的值.如果是在本地服务器执行binlog的备份,还可以从二进制日志索引文件中获取(参考脚本注释部分)
使用mysql_config_editor配置账号密码,避免在脚本中使用数据库用户的明文密码。
邮件告警处理。
在使用脚本前,必须配置mailx,创建数据库连接账号
create user bkuser@'xxx.xxx.xxx.xxx' identified by "******";grant replication client on *.* to bkuser@'%';grant replication slave on *.* to bkuser@'%';
这个根据实际情况调整,例如我就是使用xtrabackup的账号来备份mysql的binlog。 另外,如果在mysql数据库服务器本机备份binlog,那么就在本机安全加密登录,如果是在远程服务器备份binlog的话,就在远程服务器配置
$ mysql_config_editor set --login-path=server1_dbbackup -h xxx.xxx.xxx.xxx -ubkuser -p -p 3306enter password:
mysql_binlog_backup_job.sh脚本
#!/bin/sh########################################################################################## ## this script is used for mysql binlog backup. ## ## ######################################################################################## ## scriptname : mysql_binlog_backup_job.sh ## author : 潇湘隐者 ## ceratedate : 2017-04-14 ## description : ##---------------------------------------------------------------------------------------## 作业中调用此脚本,然后此脚本去调用mysql_binlog_backup.sh执行 ## mysql的二进制日志备份(将mysql的二进制日志备份到nas存储或备份存## 储上),此脚本还会判断mysqlbinlog是否在一直在备份二进制日志, ## 如果是的话,则退出当前脚本。如果mysqlbinlog已经由于服务器重 ## 启等原因退出了,则会重新调用mysql_binlog_backup.sh ##***************************************************************************************## version modified date description ##***************************************************************************************## v.1.0 2016-06-20 create the script for mysql binlog backp ## v.1.1 2016-07-26 fix some bug ## v.1.2 2023-04-14 $first_binlog从mysql中获取,即使远程备份也不用手工 ## 设定,本地备份也可以这种方式,本地备份默认从 ## mysql binlog index file读取 ###########################################################################################mysql binlog备份文件的保留天数keepy_days=7first_binlog=''log_date=$(date +%y_%m_%d_%h_%m_%s)backup_date=$(date +%y_%m_%d_%h_%m_%s)local_backup_dir=/dbbackup/mysql_backup/db_backup/binlog_backup#mysql_binlog_index=/data/bin_logs/mysql_binlog.indexmysql_cmd=/opt/mysql/mysql8.0/bin/mysqlbackup_log_path=/dbbackup/mysql_backup/logserror_log=${backup_log_path}/binlog_backup_error_${backup_date}.logfile_type="mysql_binlog.*"sql_text='show binary logs'mail_to="xxxx@xxx.com.cn"mail_from="xxxx@xxx.com.cn"mysql_login_path=server1_dbbackuperror(){ echo "$1" 1>&2 echo "$1" >> ${error_log} echo "$1" | mailx -s "the binlog backup on the server `hostname` failed ,please check the log!" -r ${mail_from} ${mail_to} exit 1}##目录不存在则创建目录if [ ! -d $backup_log_path ];then mkdir -p $backup_log_pathfiif [ ! -x /bin/mailx ];then error "{log_date}:mailx did not exists!" fiif [ ! -x $mysql_cmd ];then error "{log_date}: mysql client did not exists!" fi#sql_result=`mysql -h${remote_host} -p${port} -u${user_name} -p${password} ${database_name} -bse "${sql_text}"`sql_result=`$mysql_cmd --login-path=${mysql_login_path} -bse "${sql_text}"`first_binlog=`echo ${sql_result} | awk '{print $1}'`echo $first_binlogif [ ! $first_binlog ];then error "${log_date}: please check the mysql binlog" fi##create local_backup_dir if this folder is not existsif [ ! -d ${local_backup_dir} ];then mkdir -p ${local_backup_dir}fiif [ ! -e ${mysql_binlog_index} ];then error "${log_date}:mysql binlog index file did not exists, please check it!" fi#删除keepy_days天之前的binlog备份文件find ${local_backup_dir} -name "${file_type}" -type f -mtime +$keepy_days -delete#删除30天前的错误日志find ${backup_log_path} -name "binlog_backup_error*.log" -mtime 30 -deleteprocess_num=$(ps -ef | grep -w mysqlbinlog | grep -v grep |wc -l)if [ ${process_num} -ge 1 ];then exit 1 else #如果是在本机备份binlog到nas存储或备份存储上,从二进制文件的索引获取当前mysql数据库最小的binlog文件 #如果是远程备份二进制日志(binlog)的话,则使用下面注释的脚本获取 #first_binlog=$(head -1 ${mysql_binlog_index}) #first_binlog=$(find ${local_backup_dir} -name "mysql_binlog.*" -printf "%p\t%c@\n" | sort -k2 -g |head -1 | awk '{print $1}' | awk -f "/" '{print $nf}') echo ${first_binlog} nohup sh /dbbackup/mysql_backup/scripts/mysql_binlog_backup.sh ${first_binlog} ${local_backup_dir} ${file_type} &fi
mysql_binlog_backup.sh脚本
#!/bin/sh########################################################################################## ## this script is used for mysql binlog local or remote backup. ## ## ######################################################################################## ## scriptname : mysql_binlog_backup.sh ## author : kerry ## ceratedate : 2017-04-14 ## description : ##---------------------------------------------------------------------------------------## 此脚本参考了https://www.cnblogs.com/ivictor/p/5502240.html ## 的脚本,在它的基础上做了一些改进,例如,ivitcor中脚本备份binlog## 如果服务器重启了,则必须手动执行脚本....... ##***************************************************************************************## version modified date description ##***************************************************************************************## v.1.0 2016-06-20 create the script for mysql binlog backp ## v.1.1 2016-07-26 fix some bug ##########################################################################################backup_bin=/opt/mysql/mysql8.0/bin/mysqlbinlogbackup_log_path=/dbbackup/mysql_backup/logslog_date=$(date +%y_%m_%d_%h_%m_%s)backup_log=${backup_log_path}/binlog_backup.logerror_log=${backup_log_path}/binlog_backup_error_${log_date}.log#复制二进制日志的主机,可以远程mysql数据库也可以是本机mysql_login_path=server1_dbbackup#time to wait before reconnecting after failuresleep_seconds=10mail_to="xxx@xxx.com.cn"mail_from="xxx@xxx.com.cn"error(){ echo "$1" 1>&2 echo "$1" >> ${error_log} echo "$1" | mailx -s "the binlog backup on the server `hostname` failed ,please check the log!" -r ${mail_from} ${mail_to} exit 1}##目录不存在则创建目录if [ ! -d $backup_log_path ];then mkdir -p $backup_log_pathfiif [ "$#" -ne 3];then error "${log_date}:you must input 3 arguments" fiif [ ! $1 ];then error "${log_date}:first_binlog arguments is null" else first_binlog=$1fiif [ ! $2 ];then error "${log_date}:local_backup_dir arguments is null" else local_backup_dir=$2fiif [ ! $3 ];then error "${log_date}:file_type arguments is null" else file_type=$3fi##检查mysqlbinlog二进制文件是否存在if [ ! -x ${backup_bin} ];then error "${log_date}:mysqlbinlog did not exists, please check it!" ficd ${local_backup_dir}## 运行while循环,连接断开后等待指定时间,重新连接while :do #如果当前备份二进制日志目录为空,则使用mysql实例最小的二进制日志文件名 if [ `ls -a "${local_backup_dir}" |wc -l` -eq 0 ];then last_binlog_file=${first_binlog} else #last_file=`ls -l ${local_backup_dir} | grep -v backuplog |tail -n 1 |awk '{print $9}'` #echo ${local_backup_dir} #echo ${file_type} #取mysqlbinlog备份的最后一个binlog文件名 last_binlog_file=`find ${local_backup_dir} -name "${file_type}" -printf "%p\t%c@\n" | sort -k2 -g |tail -1 | awk '{print $1}' | awk -f "/" '{print $nf}'` fi #${backup_bin} --login-path=${mysql_login_path} --read-from-remote-server --raw --stop-never --host=${remote_host} --port=${remote_port} ${last_binlog_file} ${backup_bin} --login-path=${mysql_login_path} --read-from-remote-server --raw --stop-never ${last_binlog_file} echo "`date +"%y/%m/%d %h:%m:%s"` mysqlbinlog停止,返回代码:$?" | tee -a ${backup_log} echo "${sleep_seconds}秒后再次连接并继续备份" | tee -a ${backup_log} sleep ${sleep_seconds}done
配置作业
*/10 * * * * /dbbackup/mysql_backup/scripts/mysql_binlog_backup_job.sh >> /dbbackup/mysql_backup/logs/mysql_binlog_back.log 2>&1
以上就是mysql中binlog怎么备份脚本的详细内容。
其它类似信息

推荐信息