返回顶部
首页 > 资讯 > 数据库 >MySQL定时备份(全量备份+增量备份)
  • 148
分享到

MySQL定时备份(全量备份+增量备份)

MySQL定时备份(全量备份+增量备份) 2016-10-03 01:10:53 148人浏览 绘本
摘要

参考 zmcyu 的 Mysql数据库的完整备份、差异备份、增量备份 更多binlog的学习参考马丁传奇的 mysql的binlog日志,这篇文章写得认真详细,如果看的认真的话,肯定能学的很好的。 如果查看binlog是出现语句加密的情况

MySQL定时备份(全量备份+增量备份)

参考 zmcyu  Mysql数据库的完整备份、差异备份、增量备份

更多binlog的学习参考马丁传奇的 mysql的binlog日志,这篇文章写得认真详细,如果看的认真的话,肯定能学的很好的。
如果查看binlog是出现语句加密的情况,参考 mysql row日志格式下 查看binlog sql语句

说明

产品上线后,数据非常非常重要,万一哪天数据被误删,那么就gg了,准备跑路吧。
所以要对线上的数据库定时做全量备份增量备份

增量备份的优点是没有重复数据,备份量不大,时间短。但缺点也很明显,需要建立在上次完全备份及完全备份之后所有的增量才能恢复。

MySQL没有提供直接的增量备份方法,但是可以通过mysql二进制日志间接实现增量备份。二进制日志对备份的意义如下:

  • 二进制日志保存了所有更新或者可能更新数据的操作
  • 二进制日志在启动MySQL服务器后开始记录,并在文件达到所设大小或者收到flush logs 命令后重新创建新的日志文件
  • 只需定时执行flush logs 方法重新创建新的日志,生成二进制文件序列,并及时把这些文件保存到一个安全的地方,即完成了一个时间段的增量备份。

全量备份

mysqldump --lock-all-tables --flush-logs --master-data=2 -u root -p test > backup_sunday_1_PM.sql
  • 参数 --lock-all-tables

对于InnoDB将替换为 --single-transaction
该选项在导出数据之前提交一个 BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于事务表,例如 InnoDB 和 BDB。本选项和 --lock-tables 选项是互斥的,因为 LOCK TABLES 会使任何挂起的事务隐含提交。要想导出大表的话,应结合使用 --quick 选项。

  • 参数 --flush-logs,结束当前日志,生成并使用新日志文件

  • 参数 --master-data=2,该选项将会在输出SQL中记录下完全备份后新日志文件的名称,用于日后恢复时参考,例如输出的备份SQL文件中含有:CHANGE MASTER TO MASTER_LOG_FILE="MySQL-bin.000002", MASTER_LOG_POS=106;

  • 参数 test,该处的test表示数据库test,如果想要将所有的数据库备份,可以换成参数 --all-databases

  • 参数 --databases 指定多个数据库

  • 参数 --quick-q,该选项在导出大表时很有用,它强制 MySQLdump 从服务器查询取得记录直接输出而不是取得所有记录后将它们缓存到内存中。

  • 参数 --ignore-table,忽略某个数据表,如 --ignore-table test.user 忽略数据库test里的user表

  • 更多mysqldump 参数,请参考网址

全量备份脚本shell

#!/bin/bash
# mysql 数据库全量备份

# 用户名、密码、数据库名
username="root"
passWord="tencns152"
dbName="Goodthing"

beginTime=`date +"%Y年%m月%d日 %H:%M:%S"`
# 备份目录
bakDir=/home/mysql/backup
# 日志文件
logFile=/home/mysql/backup/bak.log
# 备份文件
nowDate=`date +%Y%m%d`
dumpFile="${dbName}_${nowDate}.sql"
gzDumpFile="${dbName}_${nowDate}.sql.tgz"

cd $bakDir
# 全量备份(对所有数据库备份,除了数据库goodthing里的village表)
/usr/local/mysql/bin/mysqldump -u${username} -p${password} --quick --events --databases ${dbName} --ignore-table=goodthing.village --ignore-table=goodthing.area --flush-logs --delete-master-logs --single-transaction > $dumpFile
# 打包
/bin/tar -zvcf $gzDumpFile $dumpFile
/bin/rm $dumpFile

endTime=`date +"%Y年%m月%d日 %H:%M:%S"`
echo 开始:$beginTime 结束:$endTime $gzDumpFile succ >> $logFile

# 删除所有增量备份
cd $bakDir/daily
/bin/rm -f *

这里全量备份只备份了一个数据库,因为如果所有数据库都备份的话,文件太大了。这里的取舍我也不是很清楚,毕竟自己还在学习阶段,没有实际的操作经验。

增量备份

1. 检查log_bin是否开启

进入mysql命令行,执行 show variables like "%log_bin%"

mysql> show variables like "%log_bin%";
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| log_bin                         | OFF   |
| log_bin_basename                |       |
| log_bin_index                   |       |
| log_bin_trust_function_creators | OFF   |
| log_bin_use_v1_row_events       | OFF   |
| sql_log_bin                     | ON    |
+---------------------------------+-------+
6 rows in set (0.01 sec)

如上所示,log_bin 未开启;如果log_bin开启,则跳过第2步,直接进入第3步。

2. 开启 log_bin,并重启mysql

  • 编辑 mysql 的配置文件 vim /etc/my.cnf,在 mysqld 下面添加下面2条配置
[mysqld]
log-bin=/var/lib/mysql/mysql-bin
server_id=152

Tip1: 一定要加 server_id,否则会报错。至于server_id的值,随便设就可以。
Tip2: log_bin 中间可以下划线_相连,也可以-减号相连。同理server_id也一样。

  • 重启mysql
service mysqld restart
  • 再次在mysql命令行中执行 show variables like "%log_bin%"
mysql> show variables like "%log_bin%";
+---------------------------------+--------------------------------+
| Variable_name                   | Value                          |
+---------------------------------+--------------------------------+
| log_bin                         | ON                             |
| log_bin_basename                | /var/lib/mysql/mysql-bin       |
| log_bin_index                   | /var/lib/mysql/mysql-bin.index |
| log_bin_trust_function_creators | OFF                            |
| log_bin_use_v1_row_events       | OFF                            |
| sql_log_bin                     | ON                             |
+---------------------------------+--------------------------------+
6 rows in set (0.01 sec)

3. 备份

  • 进入mysql命令行,执行 show master status;
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |      430 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

当前正在记录日志的文件名是 mysql-bin.000003

  • 比如当前数据库test的bk_user只有2条记录
mysql> select * from test.bk_user;
+----+------+------+------+
| id | name | sex  | age  |
+----+------+------+------+
|  1 | 小明 ||   25 |
|  2 | 小红 | 女   |   21 |
+----+------+------+------+
2 rows in set (0.00 sec)
  • 插入一条新的记录
mysql> insert into test.bk_user(name, sex, age) values("小强", "男", 24);
Query OK, 1 row affected (0.02 sec)
mysql> select * from test.bk_user;
+----+------+-----+-----+
| id | name | sex | age |
+----+------+-----+-----+
|  1 | 小明 ||  25 |
|  2 | 小红 | 女  |  21 |
|  5 | 小强 ||  24 |
+----+------+-----+-----+
3 rows in set (0.03 sec)
  • 执行命令mysqladmin -uroot -p密码 flush-logs,生成并使用新的日志文件

再次查看当前使用的日志文件,已经变为 mysql-bin.000004 了。
mysql-bin.000003 则记录着刚才执行的 insert 语句的日志。

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000004 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

到这里,其实已经完成了增量备份了。

恢复增量备份

  • 首先假装误删数据库记录
mysql> delete from test.bk_user where id=4;
Query OK, 1 row affected (0.01 sec)

mysql> select * from test.bk_user;
+----+------+------+------+
| id | name | sex  | age  |
+----+------+------+------+
|  1 | 小明 ||   25 |
|  2 | 小红 | 女   |   21 |
+----+------+------+------+
2 rows in set (0.00 sec)
  • 从备份的日志文件mysql-bin.000003中恢复数据
[root@Centos56 ~]# mysqlbinlog --no-defaults /var/lib/mysql/mysql-bin.000003 | mysql -uroot -p test
Enter password: 
ERROR 1032 (HY000) at line 36: Can"t find record in "bk_user"

如果你也遇到这个问题的话,不妨修改 /etc/my.cnf 配置试试。
我在server_id那一行下添加了 slave_skip_errors=1032 ,然后就执行成功了,不再报错。

mysql> select * from test.bk_user;
+----+------+------+------+
| id | name | sex  | age  |
+----+------+------+------+
|  1 | 小明 ||   25 |
|  2 | 小红 | 女   |   21 |
|  5 | 小强 ||   24 |
+----+------+------+------+
3 rows in set (0.00 sec)

增量备份的shell脚本

#!/bin/bash

# 增量备份时复制mysql-bin.00000*的目标目录,提前手动创建这个目录
BakDir=/home/mysql/backup/daily
# 日志文件
LogFile=/home/mysql/backup/bak.log

# mysql的数据目录
BinDir=/var/lib/mysql-bin
# mysql的index文件路径,放在数据目录下的
BinFile=/var/lib/mysql-bin/mysql-bin.index

# 这个是用于产生新的mysql-bin.00000*文件
/usr/local/mysql/bin/mysqladmin -uroot -ptencns152 flush-logs

Counter=`wc -l $BinFile | awk "{print $1}"`
NextNum=0
# 这个for循环用于比对$Counter,$NextNum这两个值来确定文件是不是存在或最新的
for file in `cat $BinFile`
do
        base=`basename $file`
        NextNum=`expr $NextNum + 1`
        if [ $NextNum -eq $Counter ]
        then
                echo $base skip! >> $LogFile
        else
                dest=$BakDir/$base
                #test -e用于检测目标文件是否存在,存在就写exist!到$LogFile去
                if(test -e $dest)
                then
                        echo $base exist! >> $LogFile
                else
                        cp $BinDir/$base $BakDir
                        echo $base copying >> $LogFile
                fi
        fi
done

echo `date +"%Y年%m月%d日 %H:%M:%S"` $Next Bakup succ! >> $LogFile

定时备份

执行命令 crontab -e,添加如下配置

# 每个星期日凌晨3:00执行完全备份脚本
0 3 * * 0 /bin/bash -x /root/bash/Mysql-FullyBak.sh >/dev/null 2>&1

# 周一到周六凌晨3:00做增量备份
0 3 * * 1-6 /bin/bash -x /root/bash/Mysql-DailyBak.sh >/dev/null 2>&1

遇到的问题

mysqladmin: connect to server at "localhost" failed
error: "Can"t connect to local MySQL server through socket "/tmp/mysql.sock" (2)"
Check that mysqld is running and that the socket: "/tmp/mysql.sock" exists

去修改mysql的配置文件,添加

[mysqladmin]
# 修改为相应的sock
socket=/var/lib/mysql/mysql.sock
  • 执行mysqldump时遇到 Unknown table "column_statistics" in infORMation_schema (1109)
[root@centos56 bash]# /usr/local/mysql/bin/mysqldump -uroot -ptencns152 --quick --events --all-databases --flush-logs --delete-master-logs --single-transaction > /home/mysql/backup/1.sql  
mysqldump: [Warning] Using a password on the command line interface can be insecure.
mysqldump: Couldn"t execute "SELECT COLUMN_NAME,                       JSON_EXTRACT(HISTOGRAM, "$."number-of-buckets-specified"")                FROM information_schema.COLUMN_STATISTICS                WHERE SCHEMA_NAME = "atd" AND TABLE_NAME = "box_info";": Unknown table "column_statistics" in information_schema (1109)

如果使用MySQL 8.0+版本提供的命令行工具mysqldump来导出低于8.0版本的MySQL数据库到SQL文件,会出现Unknown table "column_statistics" in information_schema的错误,因为早期版本的MySQL数据库的information_schema数据库中没有名为COLUMN_STATISTICS的数据表。

解决问题的方法是,使用8.0以前版本MySQL附带的mysqldump工具,最好使用待备份的MySQL服务器版本对应版本号的mysqldump工具,mysqldump可以独立运行,并不依赖完整的MySQL安装包,比如在windows中,可以直接从MySQL安装目录的bin目录中将mysqldump.exe复制到其他文件夹,甚至从一台电脑复制到另一台电脑,然后在CMD窗口中运行。

当前使用是的MySQL 5.7.22。把5.7.20的 MYSQL_HOME/bin/mysqldump 替换掉 5.7.22的,接着就能顺利执行mysqldump了,也真是奇了怪了。

您可能感兴趣的文档:

--结束END--

本文标题: MySQL定时备份(全量备份+增量备份)

本文链接: https://lsjlt.com/news/4717.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL定时备份(全量备份+增量备份)
    参考 zmcyu 的 mysql数据库的完整备份、差异备份、增量备份 更多binlog的学习参考马丁传奇的 MySQL的binlog日志,这篇文章写得认真详细,如果看的认真的话,肯定能学的很好的。 如果查看binlog是出现语句加密的情况...
    99+
    2016-10-03
    MySQL定时备份(全量备份+增量备份)
  • mysql备份策略的实现(全量备份+增量备份)
    目录设计场景技术点服务器信息准备工作编写全量备份脚本(Mysql-FullyBak.sh)编写增量备份脚本设置定时任务crontab恢复操作最近项目需要对数据库数据进行备份,通过查阅各种资料,设计了一套数据库备份策略...
    99+
    2022-05-21
    mysql备份策略 mysql 全量备份 mysql 增量备份
  • mysql如何全量备份和增量备份
    本篇内容主要讲解“mysql如何全量备份和增量备份”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql如何全量备份和增量备份”吧!mysql 全量备份:vi...
    99+
    2024-04-02
  • mysql全量备份和增量备份方法
    文章目录 一、mysql全量备份1、修改 /etc/my.cnf文件添加如下内容2、测试任务脚本3、添加执行脚本4、天假定时任务 二、mysql增量备份1、修改 /etc/my.cnf文件...
    99+
    2023-10-11
    mysql 数据库
  • mysql全库备份/增量备份脚本
    http://hongge.blog.51cto.com/ 生产环境中Mysql数据库的备份是周期性重复的操作,所以通常是要编写脚本实现,通过crond计划任务周期性执行备份脚本 mysqldump备份...
    99+
    2024-04-02
  • Percona Xtrabackup备份mysql (完整备份与增量备份)
    Percona Xtrabackup备份mysql (完整备份与增量备份)Xtrabackup简介Percona XtraBackup是开源免费的MySQL数据库热备份软件,它能对InnoDB和XtraDB...
    99+
    2024-04-02
  • MySQL 增量备份
    增量备份的特点        增量备份的优点是没有重复数据,备份量不大,时间短。缺点也很明显,需要上次完全备份及完全备份之后所有的增量备...
    99+
    2024-04-02
  • mysql系列之5--完全备份和增量备份
    一、利用系统自带的工具实现完全备份:mysqldump数据备份方式:          物理备份:直接拷贝库或表对应的文件。限于myisam,跨平台性差 &...
    99+
    2024-04-02
  • mysql innobackupex增量备份
    注意:innobackupex 增量备份仅针对InnoDB这类支持事务的引擎,对于MyISAM等引擎,则仍然是全备。 增量备份: 增量备份需要基于全备,先假设我们已经有了一个全备(/backu...
    99+
    2024-04-02
  • DB2数据库备份,冷备份、热备份、增量备份实验
    造备份目录mkdir archivelogmkdir backup2.造库,用那个模板库db2star 3.造表,db2 connect to sampledb2 "creat...
    99+
    2024-04-02
  • MySQL数据库完全备份与增量备份详解
    目录定义完全备份与恢复演示定义 完全备份就是将数据库中的数据及所有对象全部备份。 由于 mysql 服务器中的数据文件是基于磁盘的文本文件,所以完全备份就是复制数据库文件,是最简单也是最快速的方式。 但 MySQL 服务...
    99+
    2022-08-10
    MySQL数据库完全备份 MySQL数据库增量备份
  • MySQL数据库全库备份及增量备份脚本
    脚本网盘链接下载。 1、全库备份脚本如下: #!/bin/bash ############### 定义默认值 ################# user='root' passwd='123.com...
    99+
    2024-04-02
  • rman 增量备份
    lag DG查看当前数据文件头最小的scn号: select min(to_char(CHECKPOINT_CHANGE#)) from v$datafile_header ff; 增...
    99+
    2024-04-02
  • 数据库备份周日全量+日增量备份脚本
    相信很多做运维的小伙伴都会用到mysql数据库,以下提供一个脚本与诸君分享。#!/bin/bashSCRIPT_DIR=$(dirname $0)BACKUP_DIR="/data1/mysqlb...
    99+
    2024-04-02
  • MySQL增量备份之xtrbackup
    一、软件版本 点击(此处)折叠或打开 ...
    99+
    2024-04-02
  • MySQL怎么增量备份
    本篇内容主要讲解“MySQL怎么增量备份”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL怎么增量备份”吧!添加自动任务每小时或者更短时间执行就好了#!/bin/sh#author&nbs...
    99+
    2023-06-27
  • mysql如何备份增量
    mysql 增量备份方法:使用 binlog 和 change master:启用二进制日志并记录起始位点,使用 mysqldump 备份并更新起始位点。使用 pt-table-chec...
    99+
    2024-06-15
    mysql 数据丢失
  • SVN仓库的全量备份和增量备份怎么实现
    这篇文章主要介绍“SVN仓库的全量备份和增量备份怎么实现”,在日常操作中,相信很多人在SVN仓库的全量备份和增量备份怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SVN仓库的全量备份和增量备份怎么实现...
    99+
    2023-06-04
  • XtraBackup的增量备份
    实验场景: 两个mysql实例,一个端口为3306,一个端口为3307。 现在要在3306上做增量备份,并将备份恢复到3307上去。 备份: A) 0级备份 innobackup...
    99+
    2024-04-02
  • windows 全量+增量备份脚本bat
    @set ORACLE_HOME=D:\app\Administrator\product\11.2.0\dbhome_1 @rem echo %ORACLE_HOME% @set ORACLE_SI...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作