mysql开启binlog并配置定期删除以及文件大小,删库跑路之数据恢复

2023-11-07

目录

一、开启并binlog日志并配置

1、配置文件

2、参数说明

log_bin 

log_bin_basename

binlog_error_action

binlog_format

binlog_do_db和binlog_ignore_db

sync_binlog

二、通过binglog日志还原

三、数据库备份并自动刷新binlog日志


一、开启并binlog日志并配置

1、配置文件

[mysqld]
#设置3306端口
port = 3306 
# 设置mysql的安装目录
basedir=C:\\JJS\\software\\mysql-5.7.41-winx64\\mysql-5.7.41-winx64
# 允许最大连接数
max_connections=200
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 选择binlog日志模式
binlog_format = mixed
# 开启binlog日志
log_bin =C:\\JJS\\software\\mysql-5.7.41-winx64\\jjs_binlog
# 日志最长保存七天
expire_logs_days = 7
# binglog日志单个文件最大512m
max_binlog_size = 512m
# 缓冲区内存大小
binlog_cache_size = 4m
# 最大缓冲区内存大小
max_binlog_cache_size = 1024m
# 不指定定义binlog日志同步到硬盘的规则。取值范围为0~N
sync_binlog=0
# binlog遇到错误的情况处理方式
binlog_error_action=ABORT_SERVER

server-id=1

2、参数说明

log_bin 

log_bin=ON # 是否激活二进制日志

log_bin_basename

指定了binlog的基础命名和存储路径也可以通过–log-bin(如上面贴的配置)设置。也就是说像上面的配置binlog文件会存在C:\\JJS\\software\\mysql-5.7.41-winx64目录下,文件命名方式为C:\\JJS\\software\\mysql-5.7.41-winx64\\jjs_binlog.0000xx

binlog_error_action

当发生不可以写、刷或同步binary log的时候,可能会导致数据一致性遭到破坏或者复制操作停止,这时候服务器要做什么操作。有两个选项ABORT_SERVER 服务关闭(默认值), IGNORE_ERROR 忽略错误。

binlog_format

定义binlog的日志写入格式。有三个选项可选:

STATEMENT
每一条被修改数据的sql都会记录到master的bin-log中,slave在复制的时候sql进程会解析成和原来master端执行过的相同的sql再次执行。
优点:不需要记录每一行的数据变化,减少bin-log日志量,节约磁盘IO,提高新能;缺点:容易出现主从复制不一致
ROW
日志中会记录每一行数据被修改后的情况,然后在slave端对相同的数据进行修改。
优点:能清楚的记录每一行数据修改的细节;
缺点:数据量太大
MIXED
以上两种模式的混合使用,一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog,MySQL会根据执行的SQL语句选择日志保存方式。
这种模式会导致binglog可读性变差。
 

binlog_do_db和binlog_ignore_db

binlog_do_db = db1 # 此参数表示只记录指定数据库的二进制日志,默认全部记录
binlog_ignore_db = db2# 此参数表示不记录指定的数据库的二进制日志
 

sync_binlog

定义binlog日志同步到硬盘的规则。取值范围为0~N

0
当事务提交之后,MySQL不做fsync之类的磁盘同步指令刷新binlog_cache中的信息到磁盘,而让操作系统的Filesystem自行决定什么时候来做同步,或者cache满了之后才同步到磁盘。这个是性能最好的
1或者N
当每进行n次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。
 

二、通过binglog日志还原

前言,binlog日志是以事件的形式写入二进制文件的,所以在还原数据库之前应该要正确找到开始pos和结束的pos

先介绍几个相关指令(均为mysql指令)

查看第一个日志文件: show binlog events;

查看最后一个日志和结束点: show master status; 

查看指定的日志文件: show binlog events in 'xxx';

1、数据创建并查找起止位置:

通过inser语句插入几十条记录

 此时binlog日志已经生成了记录

 我们可以使用指令查看日志事件内容

show binlog events in 'jjs_binlog.000002'

可以看到开始位置是 4 

 结束位置是7924 

为了演示多个binlog还原数据库的情景,这里手动刷新了一次binlog日志,输入指令

Flush logs

 会立即看到产生了一个新的binlog日志

 继续使用insert语句插入多条数据

使用指令查询时间起止位置

show binlog events in 'jjs_binlog.000003'

可以看到开始位置是4

结束位置是5770

这时候使用delete语句,一下清空所有的数据

在使用语句查询终止位置

show binlog events in 'jjs_binlog.000003'

可以看红框一的终止位置5770是最后一条插入语句的终止位置,而从5770往后就是delete语句,可想而知,我们本次需要执行binlog文件的范围是jjs_binlog.000002 的4 至jjs_binlog.000003 的5770 

 

 2、开始还原

方式一: 挨个binlog日志还原(注意,以下的语句不是sql,不是在数据库内执行,而是cmd指令)
 

​​​​​​​mysqlbinlog --start-position=4 --stop-position=7924 --database=textdb  jjs_binlog.000002  | mysql -uroot -proot
mysqlbinlog --start-position=4 --stop-position=5770 --database=textdb  jjs_binlog.000003  | mysql -uroot -proot

执行完毕之后可以看到数据库恢复到之前的记录

方式二:一次还原多个文件

mysqlbinlog --no-defaults  --start-position=4  --database=textdb  jjs_binlog.000002  | mysql -uroot -proot -f 
mysqlbinlog --no-defaults --stop-position=5770 --database=textdb  jjs_binlog.000003  | mysql -uroot -proot -f 

如果设置到2个以上的binlog日志,还可以开头只需要写开始位置,中间不需要表明位置,表明整个binlog日志,然后结束的时候标明结束位置

mysqlbinlog --no-defaults  --start-position=4  --database=textdb  jjs_binlog.000002  | mysql -uroot -proot -f 

mysqlbinlog --no-defaults --database=textdb  jjs_binlog.000003  | mysql -uroot -proot -f 

mysqlbinlog --no-defaults --stop-position=5770 --database=textdb  jjs_binlog.000004  | mysql -uroot -proot -f 

注意:在不能精确把握开始位置的情况下,可以适当将开始位置往前调,因为如果是遇到update和delete语句,并不会影响整体的数据结果,如果遇到的是insert语句,则会报错,但是不会终止数据还原,一直到我们需要还原的位置即可正常开始还原数据

三、数据库备份并自动刷新binlog日志

要想完整的还原数据库,那么数据库备份和binlog日志必须要协调起来。在数据库备份时就要刷新一下binlog日志,这样子以后还原数据库的时候可以先用备份还原数据库,然后通过备份时间找到binlog日志,在通过binlog日志还原从备份到现在丢失的数据。

下面这段代码为数据库备份的bat指令,只需要配合定时任务即可实现定时备份数据库,

rem ******Start backing up the database. After the database backup is completed, the window will automatically close******
@echo off

::删除一周前的备份数据

forfiles /p "D:\mysql-5.7.33-winx64" /m backup_*.sql -d -7 /c "cmd /c del /f @path"

::设置时间变量

set "Ymd=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%"

::进入mysql安装目录的bin目录下

cd D:\mysql-5.7.33-winx64\bin

::执行备份操作

mysqldump --opt --single-transaction=TRUE --user=root --password=root --flush-logs --host=127.0.0.1 --protocol=tcp --port=3306 --default-character-set=utf8 --single-transaction=TRUE --routines --events "textdb" > D:\mysql-5.7.33-winx64\bin\backup_%Ymd%.sql

@echo on

rem ******Database backup completed******

mysqldump --opt --single-transaction=TRUE --user=root --password=root --flush-logs --host=127.0.0.1 --protocol=tcp --port=3306 --default-character-set=utf8 --single-transaction=TRUE --routines --events "sdey" > D:\mysql-5.7.33-winx64\bin\backup_%Ymd%.sql

--flush-logs的作用就是在备份数据库时刷新binlog日志。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql开启binlog并配置定期删除以及文件大小,删库跑路之数据恢复 的相关文章

  • Python Twisted 和数据库连接

    我们的工作项目包括同步应用程序 短期 和异步 Twisted 应用程序 长期 我们正在重构我们的数据库 并将构建一个 API 模块来解耦该模块中的所有 SQL 我想创建该 API 以便同步和异步应用程序都可以使用它 对于同步应用程序 我希望
  • 为什么不能将 MYSQL 函数传递到准备好的 PDO 语句中?

    在我看来 以下脚本应该有效 stmt db gt prepare UPDATE table SET status date modified stmt gt execute array 1 NOW 但经过时NOW 进入准备好的声明中 什么也
  • django - 设置中带有数据库 url 的 MySQL 严格模式

    我在设置中使用数据库 URL 字符串 例如 DATABASES default mysql root localhost 3306 mydb 当我迁移时 我收到此警告 MySQL Strict Mode is not set for dat
  • 将数据从 MS SQL 导入 MySQL

    我想从 MS SQL Server 导入数据 通过某种正则表达式运行它以过滤掉内容 然后将其导入 MySQL 然后 对于每个查询 我希望显示来自第三个数据库的相关图像 明智地导入和链接 最简单的方法是什么 谢谢 澄清 它是一个 PHP 应用
  • MySQL 过去 12 个月的月度销售情况,包括没有销售的月份

    SELECT DATE FORMAT date b AS month SUM total price as total FROM cart WHERE date lt NOW and date gt Date add Now interva
  • PHP 数据库显示在具有不同锚标记的相同字段中

    我四处寻找 看看这是否可行 但却空手而归 首先 这是我的代码 div style display none div ul li li li li li li ul
  • 将程序存储在 phpMyAdmin 中

    我必须将存储过程添加到 MySQL 数据库 问题是托管提供php我的管理员来管理数据库 我在网上搜索了一下 想法是运行创建程序的MySQL本机语句 但由于程序的代码通常可能有 我们必须更改 MySQL 中的分隔符 php我的管理员没有这个选
  • php echo 不工作

    我的代码似乎不起作用 单选按钮出现 但旁边什么也没有 似乎 mysql fetch array 由于某种原因无法工作 因为我已经玩过代码并反复测试它以查找代码似乎遇到的位置出现问题并停止工作 有人可以告诉我出了什么问题吗 欢呼声我是新手 最
  • 从数据库中给定时间起经过的时间

    我有一个 HTML 表 其中包含从数据库中提取的记录 我正在使用 PHP MySQL 我的表中名为 Timer 的列未从数据库中检索 我需要在此处显示经过的时间 从数据库中的特定时间开始 例如 假设现在的时间是2013年2月21日下午6点2
  • mysql中的按位移位

    如何在 MySQL 中进行按位移位 有没有具体的指令或者操作符 如果不是 如何最佳地模拟它 看一下按位运算符MySQL first http dev mysql com doc refman 5 0 en bit functions htm
  • MYSQL 查询 WHERE IN 与 OR

    我开发了一个使用 OR 查询的系统 SELECT FROM tableA JOIN tableB ON idA idB WHERE idA 1 OR idA 2 OR idA 3 OR idA 4 OR idA 5 OR idA 100 与
  • 列是存在的,但是当我尝试删除它时,它说 MYSQL 中没有列? **错误代码:1091。无法删除...**

    我尝试运行以下查询 ALTER TABLE ORDER DETAIL DROP foreign key USER ID It says Error Code 1091 Can t DROP USER ID check that column
  • MySQL 获取时间优化

    o我有一个包含 200 万个寄存器的表 但它很快就会增长得更多 基本上 该表包含具有相应描述符的图像的兴趣点 当我尝试执行选择在空间上靠近查询点的点的查询时 总执行时间花费太长 更准确地说 持续时间 获取 0 484 秒 27 441 秒
  • Mac OS X Yosemite/El Capitan 上自动启动 MySQL 服务器

    我想在启动时自动启动 MySQL 服务器 这在小牛队是可能的 但在优胜美地似乎不起作用 edit 似乎这也适用于 El Capitan dcc 非常接近 这是 MySQL 在 Yosemite 上再次自动启动的方式 The com mysq
  • 如果一列没有值,MySQL 返回最大值或 null

    我尝试获取 mysql select 的最大值 但如果有一行不包含时间戳 则希望将其设置为 null empty 0 表统计数据 简化 ID CLIENT ORDER DATE CANCEL DATE 1 5 1213567200 2 5
  • 每个搜索词显示一行,如果未找到则替换默认值

    Query SELECT product id name FROM product WHERE barcode in 681027 8901030349379 679046 679047 679082 679228 679230 67923
  • MYSQL:SQL查询获取自增字段的值

    我有一张桌子 主键是id及其自动递增 现在 当我插入新记录时 我需要获取更新记录的 id 我怎样才能做到这一点 如果我使用查询 select max id from table name 执行后我可以获得id 但我能确定它是刚刚插入的记录的
  • CakePHP - 获取上次运行的查询

    我想获取 CakePHP 运行的最后一个查询 我无法在 core php 中打开调试 也无法在本地运行代码 我需要一种方法来获取最后一个 sql 查询并将其记录到错误日志中而不影响实时站点 该查询失败但正在运行 像这样的事情会很棒 this
  • MySQL中如何存储小数?

    我尝试过将 DECIMAL 与 2 2 一起使用 但它不允许我使用它 我只想存储一个数字 例如 7 50 或 10 50 我需要将这两个数字保留在小数点后 但是当我刷新数据库时 它会将值重置为 0 99 有什么建议么 第一个参数DECIMA
  • 使用 DBCP 配置 Tomcat

    在闲置一段时间 几个小时 后 我们收到了 CommunicationsException 来自 DBCP 错误消息 在异常中 位于这个问题的末尾 但我没有看到任何配置文件中定义的 wait timeout 我们应该看哪里 在 tomcat

随机推荐