1

我有一个名为“radacct”的 mysql 数据库表,其中包含从 2016 年 1 月 1 日(一月)到 2016 年 6 月 29 日(六月)的数据。由于某种原因,从 2016 年 6 月 20 日到 2016 年 6 月 25 日的数据丢失了。我有bin-log enabled所以我用“ mysqlbinlog”将bin文件导出到.sql文件,那些sql文件包含1月、2月、3月的旧数据以及2016-06-20到2016-06-25丢失的数据. 如何在不丢失当前数据的情况下恢复丢失的数据。

我正在考虑选择.sql包含丢失数据的文件(我使用日期字段来识别丢失的数据)并替换INSERT INTOREPLACE INTO.

这是sql文件的样子

#160622 15:06:47 server id 1  end_log_pos 1073739089    Query   thread_id=235   exec_time=0     error_code=0
SET TIMESTAMP=1466622407/*!*/;
UPDATE radacct SET              acctstoptime       = '2016-06-23 00:51:55',              acctsessiontime    = '1',              acctinputoctets    = '0' << 32 |                                   '0',              acctoutputoctets   = '0' << 32 |                                   '0',              acctterminatecause = 'User-Error',              acctstopdelay      = '0',              connectinfo_stop   = ''           WHERE acctsessionid   = '172784299'           AND username          = 'fusernamehighlands'           AND nasipaddress      = '11.11.11.234'
/*!*/;
# at 1073739089
#160622 15:06:47 server id 1  end_log_pos 1073739162    Query   thread_id=235   exec_time=0     error_code=0
SET TIMESTAMP=1466622407/*!*/;
COMMIT
/*!*/;
# at 1073739162
#160622 15:06:47 server id 1  end_log_pos 1073739234    Query   thread_id=238   exec_time=0     error_code=0
SET TIMESTAMP=1466622407/*!*/;
BEGIN
/*!*/;
# at 1073739234
#160622 15:06:47 server id 1  end_log_pos 1073739262    Intvar
SET INSERT_ID=264950750/*!*/;
# at 1073739262
#160622 15:06:47 server id 1  end_log_pos 1073740354    Query   thread_id=238   exec_time=0     error_code=0
SET TIMESTAMP=1466622407/*!*/;
INSERT INTO radacct             (acctsessionid, acctuniqueid, username,              realm, nasipaddress, nasportid,              nasporttype, acctstarttime, acctstoptime,              acctsessiontime, acctauthentic, connectinfo_start,              connectinfo_stop, acctinputoctets, acctoutputoctets,              calledstationid, callingstationid, acctterminatecause,              servicetype, framedprotocol, framedipaddress,              acctstartdelay, acctstopdelay)           VALUES             ('172784282', '984f06cc1b00ee56',              'fusernamepranish',              '', '11.11.11.234', '297796676',              'Ethernet',              DATE_SUB('2016-06-23 00:51:55',                  INTERVAL (1 +                  0) SECOND),              '2016-06-23 00:51:55', '1', 'RADIUS', '',              '',              '0' << 32 |              '0',              '0' << 32 |              '0',              '', 'a8:32:9a:00:c3:17',              'User-Error',              'Framed-User', 'PPP', '',              '0', '0')
/*!*/;
# at 1073740354
#160622 15:06:47 server id 1  end_log_pos 1073740381    Xid = 8589937
COMMIT/*!*/;
# at 1073740381
#160622 15:06:47 server id 1  end_log_pos 1073740453    Query   thread_id=239   exec_time=0     error_code=0
SET TIMESTAMP=1466622407/*!*/;
BEGIN
/*!*/;
# at 1073740453
#160622 15:06:47 server id 1  end_log_pos 1073740481    Intvar
SET INSERT_ID=264950749/*!*/;
# at 1073740481
#160622 15:06:47 server id 1  end_log_pos 1073741574    Query   thread_id=239   exec_time=0     error_code=0
SET TIMESTAMP=1466622407/*!*/;
INSERT INTO radacct             (acctsessionid, acctuniqueid, username,              realm, nasipaddress, nasportid,              nasporttype, acctstarttime, acctstoptime,              acctsessiontime, acctauthentic, connectinfo_start,              connectinfo_stop, acctinputoctets, acctoutputoctets,              calledstationid, callingstationid, acctterminatecause,              servicetype, framedprotocol, framedipaddress,              acctstartdelay, acctstopdelay)           VALUES             ('172784297', '1afbaf4540c44f65',              'wusernamebadri158',              '', '11.11.11.234', '297796655',              'Ethernet',              DATE_SUB('2016-06-23 00:51:55',                  INTERVAL (1 +                  0) SECOND),              '2016-06-23 00:51:55', '1', 'RADIUS', '',              '',              '0' << 32 |              '0',              '0' << 32 |              '0',              '', '44:d9:e7:0c:a7:7e',              'User-Error',              'Framed-User', 'PPP', '',              '0', '0')
/*!*/;
# at 1073741574
#160622 15:06:47 server id 1  end_log_pos 1073741601    Xid = 8589935
COMMIT/*!*/;
# at 1073741601
#160622 15:06:47 server id 1  end_log_pos 1073741673    Query   thread_id=233   exec_time=0     error_code=0
SET TIMESTAMP=1466622407/*!*/;
BEGIN
/*!*/;
# at 1073741673
#160622 15:06:47 server id 1  end_log_pos 1073742164    Query   thread_id=233   exec_time=0     error_code=0
SET TIMESTAMP=1466622407/*!*/;
UPDATE radacct           SET              framedipaddress = '10.4.72.235',              acctsessiontime     = '0',              acctinputoctets     = '0'  << 32 |                                    '0',              acctoutputoctets    = '0' << 32 |                                    '0'           WHERE acctsessionid = '172784288'           AND username        = 'btwamrit'           AND nasipaddress    = '11.11.11.234'
/*!*/;
# at 1073742164
#160622 15:06:47 server id 1  end_log_pos 1073742191    Xid = 8589941
COMMIT/*!*/;
# at 1073742191
#160622 15:06:47 server id 1  end_log_pos 1073742234    Rotate to mysql-bin.000003  pos: 4
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
4

2 回答 2

2

您可以使用mysqlbinlog --start-datetime="2016-01-01 00:00:00" --stop-datetime="2016-06-29 23:59:59" <log file> > <sql file path>

于 2016-06-29T05:28:58.373 回答
0

我无法data from specific days of the month eg. day 11,12,13使用二进制日志恢复删除的表的数据 [],但学习了一些有用的步骤,这些步骤可能在可能的数据库故障期间有用。

The MariaDB server's binary log is a set of files containing "events" 
which represent modifications to the contents of a MariaDB database.
These events are written in a binary (i.e. non-human-readable) format.
The mysqlbinlog utility is used to view these events in plain text.
Note: binary logging should be enabled on mysql server. to enable it edit  my.cnf file and under "[mysqld]" section
[mysqld]
....
log-bin  
....

重新启动 mysql 服务。现在您将在 /var/lib/mysql 目录中创建 mysql 二进制日志文件

For example if there are few binlog files like 
 ls -1   /var/lib/mysql
 mysql-bin.000051  
 mysql-bin.000052  
 mysql-bin.000053  
 mysql-bin.000054 

the sql file can be generated for those bin files and then later be imported into database

 mysqlbinlog mariadb-bin.000051 > /tmp/mariadb-bin51.sql 
 mysqlbinlog mariadb-bin.000052 > /tmp/mariadb-bin51.sql  
 ...
 OR
 for i in `seq 51 58`;do mysqlbinlog mysql-bin.0000${i} > ${i}-log.sql ; sleep 1 ;done
于 2016-08-03T07:20:26.377 回答