误删GreatSQL数据?别慌,Binlog来帮忙

技术干货 | 数据中间件如何与GreatSQL数据同步? 数据中间件如何与GreatSQL数据同步? 阅读详情

误删GreatSQL数据?别慌,Binlog来帮忙

数据丢失是每一个数据库管理员和开发者都不愿面对的噩梦。然而,意外总是难免,当不小心删除了重要的数据,如何才能迅速而有效地进行恢复呢?在数据库中有二进制日志 (Binlog),它不仅记录了所有更改数据的事件,还可以帮助将数据库恢复到任何一个特定的时间点。本篇文章将带您深入了解如何利用 Binlog 来应对数据丢失问题,在面对数据误删时不再慌张。

启用 Binlog

Binlog (二进制日志)的介绍在这里就不过多描述了,不了解 Binlog 的同学,可以前往GreatSQL用户手册中 GreatSQL 日志章节查看:(https://greatsql.cn/docs/8.0.32-26/2-about-greatsql/4-3-greatsql-binary-log.html)

为了利用 Binlog (二进制日志) 进行数据恢复,首先需要确保 Binlog 已经在 GreatSQL 数据库中启用并正确配置。以下是详细的配置步骤、状态检查方法及 Binlog 文件的存储位置和命名规则。

配置 Binlog 的步骤

找到并编辑 GreatSQL 配置文件my.cnf。该文件的路径因系统和安装方式不同而有所不同,常见路径包括 /etc/my.cnf、/etc/mysql/my.cnf。

添加或修改以下配置项:

[mysqld]
log-bin=binlog
binlog-format=ROW
server-id=103306
  • log-bin:指定启用 Binlog,并设置 Binlog 文件的基本名称。这里使用 binlog 作为前缀。

  • binlog-format:设置 Binlog 的记录格式。推荐使用 ROW 格式,因为它记录的是行级别的变更,更详细和准确。

  • server-id:为服务器设置唯一的 ID,必须设置该选项才能启用 Binlog。对于单个服务器,任何正整数都可以。对于主从复制环境,确保每个服务器的 server-id 唯一。

推荐 Binlog 配置

但关于 Binlog 的配置还不止这些,在 GreatSQL 推荐 my.cnf 模板(https://greatsql.cn/docs/8.0.32-26/3-quick-start/3-4-quick-start-with-cnf.html)中还有以下几个关于 Binlog 的配置

$ cat /etc/my.cnf |grep bin  
sync_binlog = 1
binlog_cache_size = 4M
max_binlog_cache_size = 2G
max_binlog_size = 1G
#控制binlog总大小,避免磁盘空间被撑爆
binlog_space_limit = 500G
binlog_rows_query_log_events = 1
binlog_expire_logs_seconds = 604800
binlog_checksum = CRC32
  • sync_binlog = 1

    配置 GreatSQL 每次提交事务后都将 binlog 同步到磁盘。确保在系统崩溃时不会丢失已提交的事务,但可能会略微影响性能。同时配合innodb_flush_log_at_trx_commit=1即所说的双1,这是最安全的设置。

  • binlog_cache_size = 4M

    设置 Binlog 缓存大小为 4MB。当事务中的 SQL 语句较多时,事务的所有更改会被暂时保存在 Binlog 缓存中,然后一次性写入 Binlog 文件。

  • max_binlog_cache_size = 2G

    设置 Binlog 缓存的最大大小为 2GB。这限制了单个事务可以使用的 Binlog 缓存大小,防止过大的事务占用过多内存。

  • max_binlog_size = 1G

    设置单个 Binlog 文件的最大大小为 1GB。当 Binlog 文件达到此大小时,GreatSQL 会自动创建一个新的 Binlog 文件。这有助于管理和分割日志文件,使其更易于处理和备份。

  • binlog_space_limit = 500G

    设置 Binlog 文件的总存储空间限制为 500GB。如果 Binlog 文件的总大小超过此限制,GreatSQL 会自动删除最旧的 Binlog 文件。这可以防止 Binlog 文件占用过多磁盘空间。

  • binlog_rows_query_log_events = 1

    启用 Binlog 中的行查询日志事件。这将记录生成的行更改时的原始 SQL 语句,有助于调试和审计。

  • binlog_expire_logs_seconds = 604800

    设置 Binlog 文件的过期时间为 604800 秒(7 天)。超过此时间的 Binlog 文件将自动删除。这有助于管理存储空间并限制 Binlog 文件的数量。

  • binlog_checksum = CEC32

    控制二进制日志 (binlog) 文件的校验和机制。启用 CRC32 校验和,以确保 Binlog 文件的数据完整性和正确性

配置完成后需要重启 GreatSQL 服务,使配置生效

$ systemctl restart greatsql

检查 Binlog 状态

配置完 Binlog 并重启 GreatSQL 服务后,可以通过以下方法检查 Binlog 是否已正确启用

登录 GreatSQL 并执行以下命令

  1. 检查 Binlog 启用状态
greatsql> SHOW VARIABLES LIKE 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.00 sec)

如果返回结果为 ON,表示 binlog 已启用。

  1. 检查 Binlog 格式
greatsql> SHOW VARIABLES LIKE 'binlog_format';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW   |
+---------------+-------+
1 row in set (0.01 sec)

确保 Binlog 格式为 ROW

  1. 查看 Binlog 文件列表
greatsql> SHOW BINARY LOGS;
+---------------+-----------+-----------+
| Log_name      | File_size | Encrypted |
+---------------+-----------+-----------+
| binlog.000037 |      2347 | No        |
| binlog.000038 |       220 | No        |
| binlog.000039 |       703 | No        |
| binlog.000040 | 428473707 | No        |
+---------------+-----------+-----------+
4 rows in set (0.00 sec)

该命令将列出所有当前存在的 Binlog 文件及其大小

Binlog 文件的存储位置和命名规则

  1. 存储位置:

Binlog 文件的存储位置通常由 log-bin 选项的值和 GreatSQL 数据目录共同决定。如果在 my.cnf 中未指定路径,binlog 文件会存储在 GreatSQL 数据目录下。

可以通过以下命令查看 GreatSQL 数据目录:

greatsql> SHOW VARIABLES LIKE 'datadir';
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| datadir       | /data/GreatSQL/ |
+---------------+-----------------+
1 row in set (0.00 sec)

如果 log-bin 选项指定了路径,则 binlog 文件存储在该路径下。例如:

log-bin=/data/GreatSQL/binlog
  1. 命名规则:

Binlog 文件名由 log-bin 选项的值和一个数字序列组成。例如,如果 log-bin 设置为 binlog,则生成的 binlog 文件名类似于 binlogn.000001、binlog.000002 等。

序列号是自动递增的,当一个 Binlog 文件达到最大大小(由 max_binlog_size 变量控制)时,GreatSQL 会创建一个新的 Binlog 文件,并将序列号递增。

模拟数据误删场景

此次测试环境情况如下:

  • 数据库:GreatSQL 8.0.32-25
  • 操作系统:Linux myarch 6.6.3-arch1-1 x86_64 GNU/Linux

创建测试数据

创建一个testdb库和employees表

greatsql> CREATE DATABASE testdb;
Query OK, 1 row affected (0.01 sec)

greatsql> USE testdb;
Database changed

greatsql> CREATE TABLE employees (
    ->     id INT AUTO_INCREMENT PRIMARY KEY,
    ->     name VARCHAR(100),
    ->     position VARCHAR(100),
    ->     salary DECIMAL(10, 2)
    -> );
Query OK, 0 rows affected (0.07 sec)

并插入几条示例数据

greatsql> INSERT INTO employees (name, position, salary) VALUES 
('Alice', 'Manager', 60000.00),
('Bob', 'Developer', 50000.00),
('Charlie', 'Analyst', 40000.00),
('greatsql', 'DBA', 66666.00);
Query OK, 4 rows affected (0.05 sec)
Records: 4  Duplicates: 0  Warnings: 0

确认插入成功

greatsql> SELECT * FROM employees;
+----+----------+-----------+----------+
| id | name     | position  | salary   |
+----+----------+-----------+----------+
|  1 | Alice    | Manager   | 60000.00 |
|  2 | Bob      | Developer | 50000.00 |
|  3 | Charlie  | Analyst   | 40000.00 |
|  4 | greatsql | DBA       | 66666.00 |
+----+----------+-----------+----------+
4 rows in set (0.00 sec)

模拟数据误删除

这时候要删除一条id=2的字段,而你却不小心删除了id=1的字段

greatsql> DELETE FROM employees WHERE name = 'Alice';

查看表确认被误删除了

greatsql> SELECT * FROM employees;
+----+----------+-----------+----------+
| id | name     | position  | salary   |
+----+----------+-----------+----------+
|  2 | Bob      | Developer | 50000.00 |
|  3 | Charlie  | Analyst   | 40000.00 |
|  4 | greatsql | DBA       | 66666.00 |
+----+----------+-----------+----------+
3 rows in set (0.00 sec)

恢复数据的步骤

在数据误删后,恢复数据的关键在于使用 GreatSQL 的二进制日志 (Binlog)。二进制日志记录了所有对数据库进行更改的操作,包括插入、更新和删除。因此,通过解析和重放 Binlog,可以恢复误删的数据。

确定误删的时间点

记录下 GreatSQL 服务器的时间

greatsql> SELECT NOW();
+---------------------+
| NOW()               |
+---------------------+
| 2024-06-07 14:04:23 |
+---------------------+
1 row in set (0.00 sec)

记录下当前时间,以确定误删操作发生的大致时间范围。

查找相应的 Binlog 文件

GreatSQL 的 Binlog 文件按时间顺序记录了所有对数据库的更改。你需要找到包含误删操作的 Binlog 文件。

greatsql> SHOW BINARY LOGS;
+---------------+-----------+-----------+
| Log_name      | File_size | Encrypted |
+---------------+-----------+-----------+
| binlog.000037 |      2347 | No        |
| binlog.000038 |       220 | No        |
| binlog.000039 |       703 | No        |
| binlog.000040 | 428477097 | No        |
+---------------+-----------+-----------+
4 rows in set (0.00 sec)

根据误删操作的大致时间,确定可能包含误删操作的 Binlog 文件。例如,如果误删操作发生在最近,可能需要检查 binlog.000040。

或使用SHOW MASTER STATUS命令确认当前正在使用的 Binlog

greatsql> SHOW MASTER STATUS \G
*************************** 1. row ***************************
             File: binlog.000040
         Position: 428477097
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 9548406d-8ff1-11ee-97ec-ec5c6826bca3:1-9775
1 row in set (0.00 sec)

使用 mysqlBinlog 工具读取 Binlog

使用 mysqlbinlog 工具可以读取并解析 binlog 文件,以查找并提取相关的 SQL 语句。

$ mysqlbinlog --base64-output=decode-rows -v --start-datetime="2024-06-07 00:00:00" --stop-datetime="2024-06-07 23:59:59" /data/GreatSQL/binlog.000040 > /tmp/binlog.sql
  • --base64-output=decode-rows:对二进制日志文件中的事件进行更详细的解码和输出
  • --verbose:会输出更详细的日志信息(简写 -v)

这条命令将从 binlog.000040 文件中提取指定时间范围内的日志,并将其保存到 binlog.sql 文件中。

如果没办法确定误操作的具体时间,可以把 Binlog 全部提取

打开 binlog.sql 文件,查找并确认包含误删操作的 SQL 语句。

$ vim /tmp/binlog.sql
# at 428476791
#240607 13:55:21 server id 103306  end_log_pos 428476868 CRC32 0x78030015       Query   thread_id=26    exec_time=0     error_code=0
SET TIMESTAMP=1717739721/*!*/;
BEGIN
/*!*/;
# at 428476868
# at 428476934
#240607 13:55:21 server id 103306  end_log_pos 428477005 CRC32 0xf2c276a8       Table_map: `testdb`.`employees` mapped to number 133
# has_generated_invisible_primary_key=0
# at 428477005
#240607 13:55:21 server id 103306  end_log_pos 428477066 CRC32 0x3eea7695       Delete_rows: table id 133 flags: STMT_END_F
### DELETE FROM `testdb`.`employees`
### WHERE
###   @1=1
###   @2='Alice'
###   @3='Manager'
###   @4=60000.00
# at 428477066
#240607 13:55:21 server id 103306  end_log_pos 428477097 CRC32 0xa495408d       Xid = 10249
COMMIT/*!*/;
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file

生成恢复数据的 SQL 语句

可以手工将查到的误删除数据转换为INSTER 语句重新插入回 GreatSQL 数据库。

或用以下命令,将解析后的 SQL 文件中的 DELETE 语句全部转换为 INSTER 语句

$ cat /tmp/binlog.sql | sed -n '/###/p' | sed 's/### //g;s/\/\*.*/,/g;s/DELETE FROM/;INSERT INTO/g;s/WHERE/VALUE(/g;' | sed 's/@1=//g'| sed 's/@[1-9]=/,/g' | sed 's/@[1-9][0-9]=/,/g' | sed 's/ \+/ /g'|sed ":a;N;s/\,\n ,/\n,/g;s/\,\n;/);/g;ta"|sed  '0,/;/s/;//'|sed '$ s/.$/);/'  > binlog_insert.sql

查看转换后的 SQL 语句结果

$ cat /tmp/binlog_insert.sql
INSERT INTO `testdb`.`employees`
VALUE(
 1
 ,'Alice'
 ,'Manager'
 ,60000.0);

此时将该 SQL 语句在 GreatSQL 中执行即可恢复被误删除的数据

高级恢复技巧

通过 Pos 恢复

如果不小心将所有数据都删除了,那就可以使用重放 Binlog 让数据全部回来

例如本想删除ID=1的数据,结果忘记加WHERE语句

greatsql> DELETE FROM testdb.employees;
Query OK, 3 rows affected (0.05 sec)

greatsql> SELECT * FROM testdb.employees;
Empty set (0.00 sec)

导致了testdb.employees表数据都没了,但是没关系。需要找到 Binlog 中employees表的建表语句,从建表开始重放 Binlog 到删除语句为止

同样需要解析 Binlog

$ mysqlbinlog --base64-output=decode-rows -v --start-datetime="2024-06-07 00:00:00" --stop-datetime="2024-06-07 23:59:59" /data/GreatSQL/binlog.000040 > /tmp/binlog.sql

找到employees建表语句

$ cat /tmp/binlog.sql
# at 428474721
#240607 13:46:42 server id 103306  end_log_pos 428474954 CRC32 0x2ce790d3       Query   thread_id=26    exec_time=0     error_code=0    Xid = 10238
use `testdb`/*!*/;
SET TIMESTAMP=1717739202/*!*/;
/*!80013 SET @@session.sql_require_primary_key=0*//*!*/;
CREATE TABLE employees (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    position VARCHAR(100),
    salary DECIMAL(10, 2)
)
/*!*/;

可以看到该建表语句的开始 Pos 在428474954 结束,删除语句是在428476791开始。确定了起止 Pos 直接重放 Binlog 即可

$ mysqlbinlog --skip-gtids --start-position=428474954 --stop-position=428476791 --database=testdb /data/GreatSQL/binlog.000040 | mysql -uroot -p

因为 GreatSQL 启用了 GTID 模式(@@GLOBAL.GTID_MODE = ON),而 mysqlbinlog 工具默认尝试将 @@SESSION.GTID_NEXT 设置为 ANONYMOUS,这与启用 GTID 模式的服务器不兼容,所以加上--skip-gtids,在下方 GTID 恢复也解释为什么需要添加这个参数

因为表没有被删除,所以不用重放建表语句。若表也不存在了,可以从建表语句开始重放

再次查看数据,可以看到数据都回来了

greatsql> SELECT * FROM employees;
+----+----------+-----------+----------+
| id | name     | position  | salary   |
+----+----------+-----------+----------+
|  1 | Alice    | Manager   | 60000.00 |
|  2 | Bob      | Developer | 50000.00 |
|  3 | Charlie  | Analyst   | 40000.00 |
|  4 | greatsql | DBA       | 66666.00 |
+----+----------+-----------+----------+
4 rows in set (0.00 sec)

以上展示的是根据指定位置恢复数据

通过 GTID 恢复

查看 GTID 开启前的设定

greatsql> SHOW VARIABLES LIKE '%gtid%';
+--------------------------------------------------+---------------------------------------------+
| Variable_name                                    | Value                                       |
+--------------------------------------------------+---------------------------------------------+
| binlog_gtid_simple_recovery                      | ON                                          |
| enforce_gtid_consistency                         | ON                                          |
| group_replication_broadcast_gtid_executed_period | 1000                                        |
| group_replication_gtid_assignment_block_size     | 1000000                                     |
| gtid_executed                                    | 9548406d-8ff1-11ee-97ec-ec5c6826bca3:1-9813 |
| gtid_executed_compression_period                 | 0                                           |
| gtid_mode                                        | ON                                          |
| gtid_next                                        | AUTOMATIC                                   |
| gtid_owned                                       |                                             |
| gtid_purged                                      | 9548406d-8ff1-11ee-97ec-ec5c6826bca3:1-9755 |
| secondary_engine_read_delay_gtid_threshold       | 100                                         |
| session_track_gtids                              | OFF                                         |
+--------------------------------------------------+---------------------------------------------+
12 rows in set (0.00 sec)

主要是 gtid_mode 与 enforce_gtid_consistency 需要开启

  • gtid_mode:控制 GTID 的开启和关闭。
  • enforce_gtid_consistency:确保 GTID(全局事务标识符)的一致性。

同时开启后,也能看到 gtid_next=AUTOMATIC 可知 GTID 自动递增

在 GreatSQL 中,mysql.gtid_executed 表用于记录已执行的 GTID(全局事务标识符)。这是 GTID 复制机制中的一个关键部分,用于跟踪服务器上已经执行的所有 GTID,以确保数据一致性和事务的顺利复制。

greatsql> DESC mysql.gtid_executed;
+----------------+----------+------+-----+---------+-------+
| Field          | Type     | Null | Key | Default | Extra |
+----------------+----------+------+-----+---------+-------+
| source_uuid    | char(36) | NO   | PRI | NULL    |       |
| interval_start | bigint   | NO   | PRI | NULL    |       |
| interval_end   | bigint   | NO   |     | NULL    |       |
+----------------+----------+------+-----+---------+-------+
3 rows in set (0.00 sec)
  • source_uuid:表示 GTID 的源服务器 UUID。这是生成 GTID 的服务器的唯一标识符。

  • interval_start:GTID 范围的起始值。它表示该事务范围的起始 GTID。

  • interval_end:GTID 范围的结束值。它表示该事务范围的结束 GTID。

一个 DDL 语句会产生一个 GTID ,同样 DML 一个事务也会产生一个 GTID

# 目前为 1-9813
greatsql> SHOW MASTER STATUS\G
*************************** 1. row ***************************
             File: binlog.000040
         Position: 428495255
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 9548406d-8ff1-11ee-97ec-ec5c6826bca3:1-9813
1 row in set (0.00 sec)

# 执行一个 DDL 语句
greatsql> CREATE TABLE test1 (id int);
Query OK, 0 rows affected (0.03 sec)
# 可以看到 GTID 值增加了
greatsql> SHOW MASTER STATUS\G
*************************** 1. row ***************************
             File: binlog.000040
         Position: 428495580
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 9548406d-8ff1-11ee-97ec-ec5c6826bca3:1-9814
1 row in set (0.00 sec)

同时也可以查看 Binlog

greatsql> SHOW BINLOG EVENTS IN 'binlog.000040' FROM 428495255\G
*************************** 1. row ***************************
   Log_name: binlog.000040
        Pos: 428495255
 Event_type: Gtid
  Server_id: 103306
End_log_pos: 428495334
       Info: SET @@SESSION.GTID_NEXT= '9548406d-8ff1-11ee-97ec-ec5c6826bca3:9814'
*************************** 2. row ***************************
   Log_name: binlog.000040
        Pos: 428495334
 Event_type: Query
  Server_id: 103306
End_log_pos: 428495580
       Info: use `testdb`; CREATE TABLE `test1` (
  `my_row_id` bigint unsigned NOT NULL AUTO_INCREMENT /*!80023 INVISIBLE */,
  `id` int DEFAULT NULL,
  PRIMARY KEY (`my_row_id`)
) /* xid=10933 */
2 rows in set (0.00 sec)

当看到SET @@SESSION.GTID_NEXT=这样的命令时,它意味着接下来的事务(或下一个将被写入二进制日志(Binlog)的事务)将被赋予指定的GTID。

启用GTID后,GreatSQL 在恢复 Binlog 时会过滤掉重复的 GTID 事务,这意味着相同的GTID语句只会被执行一次。然而,若多个GTID中存在相同的记录语句,这些语句将被忽略,可能因为语句缺失,从而导致数据恢复失败。因此,在进行 Binlog 备份时,添加 –skip-gtids 参数,确保忽略GTID的幂等性检查。

此时将创建test1表删除,接着在使用 GTID 恢复

greatsql> SHOW TABLES;
+------------------+
| Tables_in_testdb |
+------------------+
| employees        |
| test1            |
+------------------+
2 rows in set (0.00 sec)
greatsql> DROP TABLE test1;
Query OK, 0 rows affected (0.06 sec)

查询 Binlog 可以看到 GTID 值已经到了 9815

greatsql> SHOW BINLOG EVENTS IN 'binlog.000040' FROM 428495255\G
*************************** 1. row ***************************
   Log_name: binlog.000040
        Pos: 428495255
 Event_type: Gtid
  Server_id: 103306
End_log_pos: 428495334
       Info: SET @@SESSION.GTID_NEXT= '9548406d-8ff1-11ee-97ec-ec5c6826bca3:9814'
*************************** 2. row ***************************
   Log_name: binlog.000040
        Pos: 428495334
 Event_type: Query
  Server_id: 103306
End_log_pos: 428495580
       Info: use `testdb`; CREATE TABLE `test1` (
  `my_row_id` bigint unsigned NOT NULL AUTO_INCREMENT /*!80023 INVISIBLE */,
  `id` int DEFAULT NULL,
  PRIMARY KEY (`my_row_id`)
) /* xid=10933 */
*************************** 3. row ***************************
   Log_name: binlog.000040
        Pos: 428495580
 Event_type: Gtid
  Server_id: 103306
End_log_pos: 428495657
       Info: SET @@SESSION.GTID_NEXT= '9548406d-8ff1-11ee-97ec-ec5c6826bca3:9815'
*************************** 4. row ***************************
   Log_name: binlog.000040
        Pos: 428495657
 Event_type: Query
  Server_id: 103306
End_log_pos: 428495791
       Info: use `testdb`; DROP TABLE `test1` /* generated by server */ /* xid=10950 */
4 rows in set (0.00 sec)

因此需要跳过删除语句,则需要选取 GTID 值小于9815的 GTID 值,既 9814。

$ mysqlbinlog --skip-gtids --include-gtids='9548406d-8ff1-11ee-97ec-ec5c6826bca3:9814' /data/GreatSQL/binlog.000040 | mysql -uroot -p

进入 GreatSQL 数据库查看

greatsql> SHOW TABLES;
+------------------+
| Tables_in_testdb |
+------------------+
| employees        |
| test1            |
+------------------+
2 rows in set (0.00 sec)

可以看到 test1 表已经恢复了

其它方式恢复

重放整个 Binlog 恢复数据

$ mysqlbinlog --database=testdb /data/GreatSQL/binlog.000040 | mysql -uroot -p

根据指定时间恢复数据

$ mysqlbinlog --start-datetime="2024-06-07 00:00:00" --stop-datetime="2024-06-07 23:59:59" --database=testdb /data/GreatSQL/binlog.000040 | mysql -uroot -p

恢复总结

  1. DELETE 语句误删除单行/多行数据

​ 可以查看 Binlog 日志,把 DELETE 语句转为 INSERT 语句重新插入 GreatSQL 数据库恢复

  1. 删表(DROP / DELETE / TRUNCATE) 只能重新重放 Binlog 或者是找到备份恢复
  2. 删库 只能重新重放 Binlog 或者是找到备份恢复
  3. UPDATE 语句误修改单行/多行数据 只能重新重放 Binlog 或者是找到备份恢复

避免数据丢失的最佳实践

在管理 GreatSQL 数据库时,避免数据丢失是至关重要的任务。以上演示的都是基于 Binlog 完整保存的情况下,才可以做到完整恢复,如果 Binlog 有丢失,则没有办法恢复数据,所以完整备份数据是至关重要的工作。

定期备份和测试恢复

全量备份

定期进行全量备份,通常每周一次。全量备份捕获数据库的完整状态,可以使用 mysqldump 或 xtrabackup 工具。

$ mysqldump -u root -p --all-databases > /backup/alldb_backup.sql

若有需要,也可以定期备份一下 Binlog 日志文件

使用FLUSH LOGS刷新一下日志,此时会启用一个新的 Binlog

greatsql> FLUSH LOGS
Query OK, 0 rows affected (0.03 sec)

greatsql> SHOW BINARY LOGS;
+---------------+-----------+-----------+
| Log_name      | File_size | Encrypted |
+---------------+-----------+-----------+
| binlog.000040 | 428496353 | No        |
| binlog.000041 |       197 | No        |
+---------------+-----------+-----------+
2 rows in set (0.00 sec)

这时再把旧的 Binlog 备份下即可

测试恢复

定期测试恢复,确保备份文件是可用的,并且可以成功恢复。每个月进行一次恢复测试,确保备份策略的有效性。

避免误操作

使用 DELETE 语句或 UPDATE 语句,都需要加上WHERE 条件,避免误删除/误修改数据。

可以开启sql_safe_updates参数,

greatsql> SET GLOBAL sql_safe_updates = ON;
Query OK, 0 rows affected (0.00 sec)

greatsql> SHOW GLOBAL VARIABLES LIKE "sql_safe_updates";
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| sql_safe_updates | ON    |
+------------------+-------+
1 row in set (0.01 sec)

此时重开一个会话,使用DELETE 语句没有加上 WHERE 条件,会报错

greatsql> DELETE FROM testdb.employees ;
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column. 

使用 UPDATE 语句没有加上 WHERE 条件,会报错

greatsql> UPDATE employees SET salary =1;
ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column.

在管理 GreatSQL 数据库时,虽然有 Binlog 等强大的工具来帮助恢复误删的数据,但最好的办法还是预防。在进行任何数据操作时,应该保持高度的谨慎,充分备份数据,严格遵循操作规范。数据是企业的重要资产,任何疏忽都可能带来巨大的损失。因此,务必对每一次操作保持敬畏之心,防患于未然:)

Enjoy GreatSQL :)

关于 GreatSQL

GreatSQL是适用于金融级应用的国内自主开源数据库,具备高性能、高可靠、高易用性、高安全等多个核心特性,可以作为MySQL或Percona Server的可选替换,用于线上生产环境,且完全免费并兼容MySQL或Percona Server。

相关链接: GreatSQL社区 Gitee GitHub Bilibili

GreatSQL社区:

image

社区有奖建议反馈: https://greatsql.cn/thread-54-1-1.html

社区博客有奖征稿详情: https://greatsql.cn/thread-100-1-1.html

(对文章有疑问或者有独到见解都可以去社区官网提出或分享哦~)

技术交流群:

微信&QQ群:

QQ群:533341697

微信群:添加GreatSQL社区助手(微信号:wanlidbc )好友,待社区助手拉您进群。

科技中介服务机构如何利用数智工具提升服务效率?.docx 科技中介服务机构如何利用数智工具提升服务效率? 立即下载

相关推荐

基于非对称纳什谈判的多微网电能共享运行优化策略(Matlab代码实现)

基于非对称纳什谈判的多微网电能共享运行优化策略(Matlab代码实现)内容概要:本文档标题为《Plecs全桥LLC谐振变换器仿真模型.txt》,但实际上内容并未围绕Plecs或全桥LLC谐振变换器展开详细论述,而是罗列了大量基于Matlab/Simulink和Python的科研仿真项目标题及相关技术方向,涵盖电力系统、无人机控制、微电网优化、路径规划、状态估计、信号处理、电动汽车调度、电力电子变换器等多个领域。其中包括多种优化算法(如粒子群、遗传算法、NSGA-II)、控制策略(如PID、MPC、滑模控制)、仿真建模(如LLC谐振变换器、DAB变换器、PWM整流器)以及具体应用场景的研究实现。尽管提及“隔离型全桥LLC谐振变换器建模及参数设计资料”,但全文缺乏对该主题的具体描述、模型细节或仿真分析,仅作为条目之一出现。因此,该文档实质是一份科研项目资源清单或代码合集目录,而非针对某一主题的深入文章。; 适合人群:具备一定Matlab/Simulink或Python编程基础,从事电气工程、自动化、控制科学、电力电子、新能源系统等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①为科研工作者提供丰富的课题参考与复现资源,涵盖优化调度、控制系统设计、电力电子仿真等方向;②辅助完成硕士/博士论文、期刊论文复现、课程设计或项目开发,提升研究效率与创新性;③通过已有模型和代码快速搭建仿真平台,聚焦算法改进与性能优化。; 阅读建议:此文档应作为科研资源索引使用,读者可根据自身研究方向筛选相关条目,结合配套代码与参考资料进行深入学习与实践。对于希望研究全桥LLC谐振变换器的用户,需注意本文档未提供完整内容,建议查找标注的“仿真+设计报告+计算书”等附件资源以获取详细信息。

mysql log bin参数_mysql日志文件binlog和relaylog几个参数

配置文件中:bin log的相关参数#log_bin=On/log_bin开启或指定Expire_logs_days :定义了mysql清除过期日志的时间。二进制日志自动删除的天数。默认值为0,表示“没有自动删除”。启动时和二进制日志循环时可能删除。max_binlog_size如果二进制日志写入的内容超出给定值,日志就会发生滚动。你不能将该变量设置为大于1GB或小于4096字节。 默认值是1GB...

weixin_31640639的博客 482

高校技术转移办公室在推动成果转化过程中,如何高效完成技术成果的信息整合与价值挖掘.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

MariaDB 和 GreatSQL 性能差异背后的真相

最近项目上遇到了两次 MariaDB 和 GreatSQL 的对比,GreatSQL受到客户质疑,最后经过排查抓到性能差异背后的真相。基于此做个分享。无论是问题一中的100倍性能背后还是插入hang住,其实背后都是对产品的不了解,MariaDB 10.3.39其实对应的是5.7的产品,而且其本身的默认参数调整有作弊嫌疑,默认关闭binlog ,sync_binlog设置为0,checkpoint阈值降低,提高checkpoint的频率等设置,面向测试环境数据是很好看的,但是增加了生产环境的风险和硬件成本。

GreatSQL2021的博客 1668

高校技术转移办公室人员,如何精准挖掘并分析企业的技术需求?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

隔离型全桥LLC谐振变化器建模及参数设计资料【仿真+设计报告+计算书】

内容概要:本文档是一套关于隔离型全桥LLC谐振变换器的综合性技术资料,系统涵盖了拓扑建模、参数设计、闭环控制策略及仿真验证等关键环节。资料整合了Simulink仿真模型、详细设计报告、Mathcad计算书以及控制算法说明文档,深入探讨了恒压恒流双闭环控制、变频与移相混合控制、软启动机制等核心技术,并提供了多应用场景实例,包括双向全桥LLC、多相交错LLC以及电动汽车V2G系统中的CLLC变换器设计。此外,配套资源还包含了多种先进控制与状态估计算法(如EKF、UKF、PF及其与神经网络融合算法)的Matlab实现代码,强化了科研复现与工程实践能力。; 适合人群:适用于电气工程、电力电子及相关专业的研究生、科研人员,以及从事高频开关电源、新能源变换器开发的工程师;需具备扎实的电路理论基础与一定的仿真软件操作经验。; 使用场景及目标:①支持全桥LLC变换器的高效参数设计与动态性能优化;②服务于高校或企业的科研项目,助力拓扑创新与控制系统开发;③作为毕业设计、学术论文或工业级产品原型开发的重要技术参考,提升系统效率、稳定性和响应速度。; 阅读建议:建议结合Simulink仿真模型与Mathcad计算书同步学习,重点关注谐振元件匹配、控制环路设计与系统稳定性分析,充分利用提供的Matlab/Simulink环境进行仿真调试与二次开发,深化理论认知与实际工程应用的融合。

mysql binlog size_mysql – max_binlog_size和log-bin大小

我有一个完整的磁盘问题-rw-rw---- 1 mysql mysql 1073741982 2012-07-03 18:14 mysql-bin.000034-rw-rw---- 1 mysql mysql 1073741890 2012-07-04 14:39 mysql-bin.000035-rw-rw---- 1 mysql mysql 1073741988 2012-07-05 0...

weixin_33504929的博客 762

STM32F103移植NuttX实战:从零搭建最小系统到串口Shell(附完整配置文件)

本文详细介绍了在STM32F103C8T6开发板上移植NuttX实时操作系统的完整过程,包括环境搭建、BSP配置、系统时钟初始化、驱动裁剪、编译烧录及串口Shell交互。通过实战指南帮助开发者快速掌握NuttX移植技巧,解决典型问题,适用于嵌入式系统开发。

tree8的博客 293

技术分享 | 测试git上2500星的闪回小工具

GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。 1、实验环境 2、软件下载 3、开始测试 4、附参数说明 生产上发生误删数据或者误更新数据的事故时,传统恢复方法是利用备份重搭实例,再应用binlog来恢复数据,有时候需要找回的数据条数非常少,却要恢复几十甚至上百G的备份,费时费力。 那有没有像oracle一样的可以闪回的方式来方便的恢复数据呢,答案是有的。我们MySQL有binlog,binlog以event的形式,记录了MySQL server从启用binlog.

GreatSQL2021的博客 161

MacOS下Mixly 2.0安装避坑指南:从Java环境到终端权限全解析

本文详细解析了在MacOS系统上安装Mixly 2.0时可能遇到的核心问题与解决方案。针对Java环境版本不兼容、MacOS Gatekeeper安全机制拦截以及终端权限不足三大常见障碍,提供了从检查并配置正确Java版本、安全设置绕过到彻底解决应用内部工具链权限的完整避坑指南,帮助用户顺利完成安装并正常使用。

weixin_29231725的博客 503

银河麒麟V10系统下VLC播放器安装全攻略(附3.0.9.2版本离线包下载)

本文详细介绍了在银河麒麟V10操作系统无网络环境下,从零开始编译安装VLC 3.0.9.2播放器的完整攻略。通过构建本地YUM仓库解决依赖问题,提供离线资源包下载,并逐步指导完成编译环境配置、软件编译与安装,帮助用户在国产麒麟系统上成功部署强大的多媒体播放能力。

a2b3c4d5e的博客 1211

【mysql】MySQL binlog日志大小超过限定范围

my.cnf中有两个参数设置: expire_logs_days = 7        #binlog保留时间7天 max_binlog_size = 1G      #binlog大小   问题描述: mysql binlog大小限制1G,但是实际却达22G   分析原因: mysqld在每个二进制日志名后面添加一个数字扩展名,每次你启动服务器或刷新日志时...

MYSQL轻松学的专栏 6932

嵌入式学习笔记- 关于电容的纹波电流

纹波电流是导致电解电容发热、影响其寿命的关键交流电流成分。它不是一种特殊的电流,而是电路中必然存在的现象。要重视,不能忽视。必须保证电路中的纹波电流 < 电容的额定纹波电流。电容鼓包爆浆,要怀疑是否是纹波电流过大或电容ESR变大所致。希望这个解释能帮助您彻底理解这个概念!二 电容纹波电流与频率的关系在大多数情况下,频率越高,电容所能承受的额定纹波电流值越大。【个人理解:因为频率越低ESR越大,具体见第三节ESR与频率的关系】下面我为您详细解释为什么会这样,以及在实际应用中如何考虑。

qq_35771411的博客 2194

mysql relay log和binlog 小结

今天突然mysql数据库的一个表的数据少了很多,我想着通过查看日志来判断针对这个表到底做了那些操作,然后再有针对性的去恢复,可是直接看binlog(二进制的形式)发现很乱,看不清楚,于是上网查询得知,需要先通过mysqlb...

cke63021的博客 869

Ubuntu 24.04 部署 EMQX 5.8 开源版MQTT服务器:从零搭建到实战应用

本文详细指导如何在Ubuntu 24.04系统上部署EMQX 5.8开源版MQTT服务器。内容涵盖从环境准备、安装Erlang、下载安装包到启动服务的完整步骤,并提供了验证服务、配置网络防火墙以及通过WebSocket工具进行基础消息收发的实战方法,帮助用户快速搭建稳定、免费的物联网消息中间件。

weixin_29209825的博客 293

Matlab安装Embedded Coder Support Package for Texas Instruments C2000 Processors教程

Matlab安装Embedded Coder Support Package for Texas Instruments C2000 Processors

m0_69133594的博客 2826

binlog日志太多太大耗尽磁盘空间导致mysql卡死的问题解决

一:问题描述 今天有同事反馈,数据库卡死了,普通的一个带limit 1只反馈一条记录的查询都好久查不出来。 我查了一下,当前并没有阻塞信息,所以不是锁竞争导致的。 查看错误日志,看到了端倪: 160419 17:03:33 [ERROR]/usr/local/mysql/bin/mysqld: Disk is full writing './mysql-bin.000177'(Errcod...

雅冰石的专栏 8772

传统芯片封装工艺流程简介

塑封是将工件和树脂安装在模具中,加热模具,使树脂液化充满模具,降温保持一定时间后,树脂凝结为固态即可取出。它将一个大的晶圆切割成许多单独的小块,每个小块是一个“芯片”(Chip,die),这些芯片是单个集成电路的基本单位。对裸露在外的引线框架外脚电镀Sn-Pb合金,这样不仅可以提高外脚的抗氧化性,还有利于后续与印刷电路板的焊接。导电胶粘贴法:将含有银粉的环氧树脂(银浆)涂敷在框架或基板上,再将芯片放置其上,固化后可以将芯片牢牢粘接。引线框架的各腿是用筋连接着的,起支撑作用,塑封固化后,需要将其连筋切掉。

芯想是陈的博客 3190

mysql的binlog太多太大占用了空间的解决办法

现象:网站访问越来越慢,最后无法访问了,经过检查发现磁盘满了 分析过程及解决方案:通常出现这种问题都应该登录服务器检查磁盘、内存和进程使用的情况,通过top、df –h和free –m来检查,发现磁盘空间满了。再进一步通过du –sh对可以的目录进行检查,发现是mysql的binlog占用空间过大。清理binlog的方法如下: 1)设置日志保留时长expire_logs_days自动删除...

weixin_30652491的博客 637

µC/OS-II---任务就绪表

意思是:将变量OSRdyGrp中最低位为1的位数赋给y,那么,y就是最高优先级任务所在就绪表的行号,那么最高优先级的任务就在OSRdyGrp[y]行中,再根据。

weixin_45880844的博客 1649

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Mysql中binlog文件数限制修改

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33725239的博客 1769

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

mysql log error 太多_binlog日志太多太大耗尽磁盘空间导致mysql卡死的问题解决

今天有同事反馈,数据库卡死了,普通的一个带limit 1只反馈一条记录的查询都好久查不出来。我查了一下,当前并没有阻塞信息,所以不是锁竞争导致的。查看错误日志,看到了端倪:160419 17:03:33 [ERROR]/usr/local/mysql/bin/mysqld: Disk is full writing './mysql-bin.000177'(Errcode: 28). Waitin...

weixin_28729331的博客 880

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

mysql binlog 大小_binlog大小限制并不完全准确

查看binlog大小限制mysql> SHOW VARIABLES LIKE '%binlog_size%';+-----------------+------------+| Variable_name | Value |+-----------------+------------+| max_binlog_size | 1073741824 |+-------------...

weixin_39627430的博客 2150

mysql限制binlog天数及数量_mysql的binlog太大太多占用大量磁盘的解决

现象:zabbix邮件报警,故障PROBLEM,服务 Free disk space isless than 20% on volume :xxx.xxx.xxx.xxx发生:/data故障!分析过程及解决方案:一般出现这种问题都应该磁盘剩余空间太低,使用df –lh检查,发现磁盘空间已使用82%。再进一步经过du –sh对能够的目录进行检查,发现是mysql的binlog占用空间过大。清理bin...

weixin_30388285的博客 933

MySQL binlog后面的编号最大是多大?

导读 每个binlog文件都有编号,从最早的3位数(没错,很老的版本只有3位数~),到现在扩展到6位数,从000001开始计数。 但我打赌,你一定不知道这个序号最大可以跑到多少。 在我们知数堂的MySQL DBA课上讲到binlog序号是从000001开始,这时有细心的同学问到,是不是这个序号达到999999后,binlog就要重新开始了? 讲真,当时我也是一下子被问住了,

老叶茶馆 1223
上一篇: 通过MySQL Workbench 将 SQL Server 迁移到GreatSQL
下一篇: 某市驾驶培训监管服务平台 GreatSQL 数据库适配之旅
GreatSQL社区
博客等级 码龄5年 1210粉丝 390原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值