澳门新浦京娱乐场网站-www.146.net-新浦京娱乐场官网
做最好的网站

澳门新浦京娱乐场网站:mysql数据库误删除操作表

在普通运转专门的工作中,对于mysql数据库的备份是生死攸关的!数据库对于网址的严重性使得大家对mysql数据的军事扣留不容有失!
下一场,是人总难免会犯错误,说不准何时天津大学学脑短路了来个误操作把数据库给删除了,咋做???

刚强,binlog日志对于mysql数据库来讲是丰硕要害的。在数码错过的殷切景况下,大家反复会想到用binlog日志功用拓宽数据恢复生机(定时全备份 binlog日志复苏增量数据部分卡塔尔国,逢凶化吉!

上边,就mysql数据库误删除后的上升方案打开表达。

废话非常的少说,下边是梳理的binlog日志操作演讲:

少年老成、职业情况
(1卡塔尔MySQL数据库每晚12:00自动完全备份。
(2卡塔 尔(阿拉伯语:قطر‎某天傍上午班,9点的时候,一起事犯晕drop了一个数据库!
(3卡塔 尔(英语:State of Qatar)要求热切复苏!可采纳备份的数据文件以至增量的binlog文件举办数据恢复生机。

风流倜傥、起先驾驭binlog

二、数据恢复生机思路
(1卡塔尔利用全备的sql文件中著录的CHANGE MASTEENVISION语句,binlog文件及其地点点信息,寻觅binlog文件中增量的那有个别。
(2卡塔尔国用mysqlbinlog命令将上述的binlog文件导出为sql文件,并删除中间的drop语句。
(3卡塔 尔(阿拉伯语:قطر‎通过全备文件和增量binlog文件的导出sql文件,就能够苏醒到全体的多寡。

MySQL的二进制日志binlog能够说是MySQL最关键的日志,它记录了富有的DDL和DML语句(除了数据查询语句select卡塔尔国,以事件情势记录,还隐含语句所执行的损耗的时间,MySQL的二进制日志是专门的学问候全型的。

DDL
----Data Definition Language 数据库定义语言
入眼的下令有CREATE、ALTE大切诺基、DROP等,DDL主假若用在概念或更动表(TABLE卡塔尔的协会,数据类型,表之间的链接和自律等最早化工作上,他们大都在成立表时使用。

DML
----Data Manipulation Language 数据垄断(monopoly卡塔 尔(英语:State of Qatar)语言

三、实例证实

先是,要承保mysql开启了binlog日志成效
在/etc/my.cnf文件里的[mysqld]区块增多:
log-bin=mysql-bin

重在的通令是SELECT、UPDATE、INSERT、DELETE,就象它的名字如出风流倜傥辙,那4条命令是用来对数据库里的多寡开展操作的言语

mysqlbinlog多管闲事的选项有以下多少个:

--start-datetime:从二进制日志中读取钦命等于时间戳或许晚于本地计算机的时日

--stop-datetime:从二进制日志中读取钦赐小于时间戳大概等于本地Computer的小运取值和上述相近

--start-position:从二进制日志中读取内定position 事件地方作为初阶。

--stop-position:从二进制日志中读取钦命position 事件地点作为事件截止

*********************************************************************

诚如的话开启binlog日志大致会有1%的属性损耗。

binlog日志有五个最珍视的选择意况:

1卡塔尔国MySQL主从复制:MySQL Replication在Master端开启binlog,Master把它的二进制日志传递给slaves来到达
master-slave数据意气风发致的指标。

2卡塔尔自然便是数据复苏了,通过利用mysqlbinlog工具来使苏醒数据。

binlog日志包含两类公事:

1卡塔尔二进制日志索引文件(文件名后缀为.index卡塔 尔(英语:State of Qatar)用于记录全体的二进制文件

2卡塔 尔(英语:State of Qatar)二进制日志文件(文件名后缀为.00000*卡塔 尔(阿拉伯语:قطر‎记录数据库全数的DDL和DML(除了数据查询语句select)语句事件。

二、开启binlog日志:

1卡塔尔国编辑张开mysql配置文件/etc/mys.cnf

[root@vm-002 ~]# vim /etc/my.cnf
在[mysqld] 区块加多
log-bin=mysql-bin 确认是开发状态(mysql-bin 是日记的基本名或前缀名);

2卡塔 尔(阿拉伯语:قطر‎重启mysqld服务使配置生效

[root@vm-002 ~]# /etc/init.d/mysqld stop
[root@vm-002 ~]# /etc/init.d/mysqld restart
Stopping mysqld: [ OK ]
Starting mysqld: [ OK ]

3卡塔尔国查看binlog日志是不是打开

mysql> show variables like 'log_%';
--------------------------------- ---------------------
| Variable_name | Value |
--------------------------------- ---------------------
| log_bin | ON |
| log_bin_trust_function_creators | OFF |
| log_bin_trust_routine_creators | OFF |
| log_error | /var/log/mysqld.log |
| log_output | FILE |
| log_queries_not_using_indexes | OFF |
| log_slave_updates | OFF |
| log_slow_queries | OFF |
| log_warnings | 1 |
--------------------------------- ---------------------
9 rows in set (0.00 sec)

三、常用的binlog日志操作命令

1卡塔 尔(英语:State of Qatar)查看全体binlog日志列表

mysql> show master logs;
------------------ -----------
| Log_name | File_size |
------------------ -----------
| mysql-bin.000001 | 149 |
| mysql-bin.000002 | 4102 |
------------------ -----------
2 rows in set (0.00 sec)

2卡塔尔国查看master状态,即最终(最新)一个binlog日志的号码名称,及其最后三个操作事件pos甘休点(Position)值

mysql> show master status;
------------------ ---------- -------------- ------------------
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
------------------ ---------- -------------- ------------------
| mysql-bin.000002 | 4102 | | |
------------------ ---------- -------------- ------------------
1 row in set (0.00 sec)

3卡塔 尔(英语:State of Qatar)flush刷新log日志,自此刻开首发生八个新编号的binlog日志文件

mysql> flush logs;
Query OK, 0 rows affected (0.13 sec)

mysql> show master logs;
------------------ -----------
| Log_name | File_size |
------------------ -----------
| mysql-bin.000001 | 149 |
| mysql-bin.000002 | 4145 |
| mysql-bin.000003 | 106 |
------------------ -----------
3 rows in set (0.00 sec)

注意:

每当mysqld服务重启时,会自动执行此命令,刷新binlog日志;在mysqldump备份数据时加 -F 选项也会刷新binlog日志;

4)重置(清空)所有binlog日志

mysql> reset master;
Query OK, 0 rows affected (0.12 sec)

mysql> show master logs;
------------------ -----------
| Log_name | File_size |
------------------ -----------
| mysql-bin.000001 | 106 |
------------------ -----------
1 row in set (0.00 sec)

四、查看binlog日志内容,常用有三种方式:

1卡塔 尔(英语:State of Qatar)使用mysqlbinlog自带查看命令法:

注意:

-->binlog是二进制文件,普通文书查看器cat、more、vim等都敬谢不敏开垦,必须运用自带的mysqlbinlog命令查看

-->binlog日志与数据库文件在同目录中

-->在MySQL5.5之下版本接纳mysqlbinlog命令时后生可畏旦报错,就增进“--no-defaults”选项

查看mysql的多寡存放目录,从上边结果能够是/var/lib//mysql

[root@vm-002 ~]# ps -ef|grep mysql
root 9791 1 0 21:18 pts/0 00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql
mysql 9896 9791 0 21:18 pts/0 00:00:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock
root 9916 9699 0 21:18 pts/0 00:00:00 mysql -px xxxx
root 9919 9715 0 21:23 pts/1 00:00:00 grep --color mysql

[root@vm-002 ~]# cd /var/lib/mysql/
[root@vm-002 mysql]# ls
ibdata1 ib_logfile0 ib_logfile1 mysql mysql-bin.000001 mysql-bin.000002 mysql-bin.index mysql.sock ops test

应用mysqlbinlog命令查看binlog日志内容,下边截取此中的三个片段剖判:
[root@vm-002 mysql]# mysqlbinlog mysql-bin.000002
..............
# at 624
#160925 21:29:53 server id 1 end_log_pos 796 Query thread_id=3 exec_time=0 error_code=0
SET TIMESTAMP=1474810193/*!*/;
insert into member(`name`,`sex`,`age`,`classid`) values('wangshibo','m',27,'cls1'),('guohuihui','w',27,'cls2')        #执行的sql语句
/*!*/;
# at 796
#160925 21:29:53 server id 1 end_log_pos 823 Xid = 17                  #举行的岁月
.............

解释:

server id 1 : 数据库主机的服务号;
end_log_pos 796: sql截至时的pos节点
thread_id=11: 线程号

2卡塔 尔(阿拉伯语:قطر‎上边这种方式读收取binlog日志的全文内容相当多,不便于分辨查见到pos点音讯

上面介绍生龙活虎种特别方便的查询命令:

命令格式:

mysql> show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];

参数解释:

IN 'log_name' :钦命要询问的binlog文件名(不点名就是第叁个binlog文件)
FROM pos :内定从哪些pos初步点开端查起(不点名正是从整个文件第三个pos点初始算)
LIMIT [offset,] :偏移量(不内定正是0)
row_count :查询总条数(不点名便是全部行)

mysql> show master logs;
------------------ -----------
| Log_name | File_size |
------------------ -----------
| mysql-bin.000001 | 125 |
| mysql-bin.000002 | 823 |
------------------ -----------
2 rows in set (0.00 sec)

mysql> show binlog events in 'mysql-bin.000002'G;
*************************** 1. row ***************************
Log_name: mysql-bin.000002
Pos: 4
Event_type: Format_desc
Server_id: 1
End_log_pos: 106
Info: Server ver: 5.1.73-log, Binlog ver: 4
*************************** 2. row ***************************
Log_name: mysql-bin.000002
Pos: 106
Event_type: Query
Server_id: 1
End_log_pos: 188
Info: use `ops`; drop table customers
*************************** 3. row ***************************
Log_name: mysql-bin.000002
Pos: 188
Event_type: Query
Server_id: 1
End_log_pos: 529
Info: use `ops`; CREATE TABLE IF NOT EXISTS `member` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(16) NOT NULL,
`sex` enum('m','w') NOT NULL DEFAULT 'm',
`age` tinyint(3) unsigned NOT NULL,
`classid` char(6) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
*************************** 4. row ***************************
Log_name: mysql-bin.000002
Pos: 529
Event_type: Query
Server_id: 1
End_log_pos: 596
Info: BEGIN
*************************** 5. row ***************************
Log_name: mysql-bin.000002
Pos: 596
Event_type: Intvar
Server_id: 1
End_log_pos: 624
Info: INSERT_ID=1
*************************** 6. row ***************************
Log_name: mysql-bin.000002
Pos: 624
Event_type: Query
Server_id: 1
End_log_pos: 796
Info: use `ops`; insert into member(`name`,`sex`,`age`,`classid`) values('wangshibo','m',27,'cls1'),('guohuihui','w',27,'cls2')
*************************** 7. row ***************************
Log_name: mysql-bin.000002
Pos: 796
Event_type: Xid
Server_id: 1
End_log_pos: 823
Info: COMMIT /* xid=17 */
7 rows in set (0.00 sec)

ERROR:
No query specified

mysql>

上边这条语句能够将点名的binlog日志文件,分成有效事件行的主意赶回,并可接受limit内定pos点的最早偏移,查询条数!
如下操作示例:

a卡塔 尔(英语:State of Qatar)查询第贰个(最先)的binlog日志:

mysql> show binlog eventsG;

b卡塔尔国内定询问 mysql-bin.000002那个文件:

mysql> show binlog events in 'mysql-bin.000002'G;

c卡塔 尔(英语:State of Qatar)钦命询问 mysql-bin.000002这么些文件,从pos点:624上马查起:

mysql> show binlog events in 'mysql-bin.000002' from 624G;

d卡塔尔钦命询问 mysql-bin.000002那么些文件,从pos点:624始发查起,查询10条(即10条语句卡塔尔

mysql> show binlog events in 'mysql-bin.000002' from 624 limit 10G;

e卡塔尔国钦命询问 mysql-bin.000002这些文件,从pos点:624起初查起,偏移2行(即中间跳过2个卡塔尔,查询10条

mysql> show binlog events in 'mysql-bin.000002' from 624 limit 2,10G;

五、接受binlog日志苏醒mysql数据

以下对ops库的member表进行操作

mysql> use ops;
mysql> CREATE TABLE IF NOT EXISTS `member` (
-> `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-> `name` varchar(16) NOT NULL,
-> `sex` enum('m','w') NOT NULL DEFAULT 'm',
-> `age` tinyint(3) unsigned NOT NULL,
-> `classid` char(6) DEFAULT NULL,
-> PRIMARY KEY (`id`)
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.10 sec)

mysql> show tables;
---------------
| Tables_in_ops |
---------------
| member |
---------------
1 row in set (0.00 sec)

mysql> desc member;
--------- --------------------- ------ ----- --------- ----------------
| Field | Type | Null | Key | Default | Extra |
--------- --------------------- ------ ----- --------- ----------------
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(16) | NO | | NULL | |
| sex | enum('m','w') | NO | | m | |
| age | tinyint(3) unsigned | NO | | NULL | |
| classid | char(6) | YES | | NULL | |
--------- --------------------- ------ ----- --------- ----------------
5 rows in set (0.00 sec)

事先插入两条数据

mysql> insert into member(`name`,`sex`,`age`,`classid`) values('wangshibo','m',27,'cls1'),('guohuihui','w',27,'cls2');
Query OK, 2 rows affected (0.08 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from member;
---- ----------- ----- ----- ---------
| id | name | sex | age | classid |
---- ----------- ----- ----- ---------
| 1 | wangshibo | m | 27 | cls1 |
| 2 | guohuihui | w | 27 | cls2 |
---- ----------- ----- ----- ---------
2 rows in set (0.00 sec)

上边起初进行场景模拟:

1)

ops库会在每一日凌晨4点拓宽一次完全备份的按期布署职务,如下:
[root@vm-002 ~]# crontab -l
0 4 * * * /usr/bin/mysqldump -uroot -p -B -F -R -x --master-data=2 ops|gzip >/opt/backup/ops_$(date %F).sql.gz

此间手动推行下,将ops数据库备份到/opt/backup/ops_$(date %F).sql.gz文件中:
[root@vm-002 ~]# mysqldump -uroot -p -B -F -R -x --master-data=2 ops|gzip >/opt/backup/ops_$(date %F).sql.gz
Enter password:
[root@vm-002 ~]# ls /opt/backup/

下一场重启mysql服务

(1)在ops库下开创一张表customers

mysql> use ops;
mysql> create table customers(
-> id int not null auto_increment,
-> name char(20) not null,
-> age int not null,
-> primary key(id)
-> )engine=InnoDB;
Query OK, 0 rows affected (0.09 sec)

mysql> show tables;
---------------
| Tables_in_ops |
---------------
| customers |
---------------
1 row in set (0.00 sec)

mysql> desc customers;
------- ---------- ------ ----- --------- ----------------
| Field | Type | Null | Key | Default | Extra |
------- ---------- ------ ----- --------- ----------------
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | char(20) | NO | | NULL | |
| age | int(11) | NO | | NULL | |
------- ---------- ------ ----- --------- ----------------
3 rows in set (0.02 sec)

mysql> insert into customers values(1,"wangbo","24");
Query OK, 1 row affected (0.06 sec)

mysql> insert into customers values(2,"guohui","22");
Query OK, 1 row affected (0.06 sec)

mysql> insert into customers values(3,"zhangheng","27");
Query OK, 1 row affected (0.09 sec)

mysql> select * from customers;
---- ----------- -----
| id | name | age |
---- ----------- -----
| 1 | wangbo | 24 |
| 2 | guohui | 22 |
| 3 | zhangheng | 27 |
---- ----------- -----
3 rows in set (0.00 sec)

(2卡塔尔国今后进展全备份
[root@vm-002 ~]# mysqldump -uroot -p -B -F -R -x --master-data=2 ops|gzip >/opt/backup/ops_$(date %F).sql.gz
Enter password: 
[root@vm-002 ~]# ls /opt/backup/
ops_2016-09-25.sql.gz


参数表明:
-B:内定数据库
-F:刷新日志
-Odyssey:备份存款和储蓄进度等
-x:锁表
--master-data:在备份语句里增添CHANGE

ops_2016-09-25.sql.gz

参数表达:

-B:钦命数据库
-F:刷新日志
-宝马7系:备份存款和储蓄进度等
-x:锁表
--master-data:在备份语句里增多CHANGE

MASTECRUISER语句以至binlog文件及岗位点新闻

(3卡塔 尔(英语:State of Qatar)再度插入数据
mysql> insert into customers values(4,"liupeng","21");
Query OK, 1 row affected (0.06 sec)

mysql> insert into customers values(5,"xiaoda","31");
Query OK, 1 row affected (0.07 sec)

mysql> insert into customers values(6,"fuaiai","26");
Query OK, 1 row affected (0.06 sec)

mysql> select * from customers;
---- ----------- -----
| id | name | age |
---- ----------- -----
| 1 | wangbo | 24 |
| 2 | guohui | 22 |
| 3 | zhangheng | 27 |
| 4 | liupeng | 21 |
| 5 | xiaoda | 31 |
| 6 | fuaiai | 26 |
---- ----------- -----
6 rows in set (0.00 sec)

(4卡塔尔这时候误操作,删除了test数据库
mysql> drop database ops;
Query OK, 1 row affected (0.04 sec)

那会儿,全备之后到误操作时刻之间,客户写入的数量在binlog中,需求还原出来!

(5)查看全备之后新添的binlog文件
[root@vm-002 ~]# cd /opt/backup/
[root@vm-002 backup]# ls
ops_2016-09-25.sql.gz
[root@vm-002 backup]# gzip -d ops_2016-09-25.sql.gz 
[root@vm-002 backup]# ls
ops_2016-09-25.sql
[root@vm-002 backup]# grep CHANGE ops_2016-09-25.sql 
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=106;

那是全备时刻的binlog文件地方
即mysql-bin.000002的106行,由此在该文件以前的binlog文件中的数据都早已包涵在这里个全备的sql文件中了

(6卡塔尔移动binlog文件,并导出为sql文件,剔除中间的drop语句
翻开mysql的数额寄放目录,有下边可见是在/var/lib/mysql下
[root@vm-002 backup]# ps -ef|grep mysql
root 9272 1 0 01:43 pts/1 00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql
mysql 9377 9272 0 01:43 pts/1 00:00:00 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock
[root@vm-002 backup]# cd /var/lib/mysql/
[root@vm-002 mysql]# ls
ibdata1 ib_logfile0 ib_logfile1 mysql mysql-bin.000001 mysql-bin.000002 mysql-bin.index mysql.sock test
[root@vm-002 mysql]# cp mysql-bin.000002 /opt/backup/

将binlog文件导出sql文件,并vim编辑它删除在那之中的drop语句
[root@vm-002 backup]# mysqlbinlog -d ops mysql-bin.000002 >002bin.sql
[root@vm-002 backup]# ls
002bin.sql mysql-bin.000002 ops_2016-09-25.sql
[root@vm-002 backup]# vim 002bin.sql #剔除里面包车型的士drop语句

注意:
在苏醒全备数据在此以前必需定将该binlog文件移出,不然恢复生机进度中,会三翻五次写入语句到binlog,最后产生增量复苏数据部分变得相比较混乱

(7卡塔 尔(英语:State of Qatar)恢复数据
[root@vm-002 backup]# mysql -uroot -p < ops_2016-09-25.sql 
Enter password: 
[root@vm-002 backup]#

查看数据库,看看ops库在不在
mysql> show databases;
--------------------
| Database |
--------------------
| information_schema |
| mysql |
| ops |
| test |
--------------------
4 rows in set (0.00 sec)

mysql> use ops;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from customers;
---- ----------- -----
| id | name | age |
---- ----------- -----
| 1 | wangbo | 0 |
| 2 | guohui | 0 |
| 3 | zhangheng | 0 |
---- ----------- -----
3 rows in set (0.00 sec)

此刻过来了全备时刻的多少

随着,使用002bin.sql文书恢复生机全备时刻到删除数据库之间,新扩展的数目
[root@vm-002 backup]# mysql -uroot -p ops <002bin.sql
Enter password: 
[root@vm-002 backup]#

双重翻开数据库,开掘全备份到删除数据库之间的那部分数量也恢复生机了!!
mysql> select * from customers;
---- ----------- -----
| id | name | age |
---- ----------- -----
| 1 | wangbo | 24 |
| 2 | guohui | 22 |
| 3 | zhangheng | 27 |
| 4 | liupeng | 21 |
| 5 | xiaoda | 31 |
| 6 | fuaiai | 26 |
---- ----------- -----
6 rows in set (0.00 sec)

以上正是mysql数据库增量数据复苏的实例进程!

**********************************************
终极,总括几点:
1卡塔 尔(阿拉伯语:قطر‎本案例适用于人为SQL语句变成的误操作只怕未有主从复制等的热备景况宕机时的修补
2卡塔尔复苏条件为mysql要开启binlog日志功能,况且要全备和增量的具备数据
3卡塔 尔(英语:State of Qatar)复苏时提议对外截止更新,即禁绝更新数据库
4卡塔尔国先过来全量,然后把全备时刻点将来的增量日志,按顺序苏醒成SQL文件,然后把公文中不平常的SQL语句删除(也可透过时间和地方点卡塔 尔(英语:State of Qatar),再过来到数据库。

 原来的作品连接:

 

MASTE奥迪Q5语句以至binlog文件及岗位点新闻

待到数据库备份达成,就不用忧郁数据遗失了,因为有一同备份数据在!!

由于地点在全备份的时候利用了-F选项,那么当数据备份操作刚起头的时候系统就能自动刷新log,那样就能活动发出
三个新的binlog日志,那个新的binlog日志就能够用来记录备份之后的数据库“增加和删除改”操作

翻开一下:

mysql> show master status;
------------------ ---------- -------------- ------------------
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
------------------ ---------- -------------- ------------------
| mysql-bin.000003 | 106 | | |
------------------ ---------- -------------- ------------------
1 row in set (0.00 sec)

约等于说, mysql-bin.000003 是用来记录4:00随后对数据库的具备“增加和删除改”操作。

2)

上午9点上班了,由于业务的必要会对数据库实行各个“增加和删除改”操作。

比如:在ops库下member表内插入、改正了数码等等:

率先晚上实行插队数据:

mysql> insert into ops.member(`name`,`sex`,`age`,`classid`) values('yiyi','w',20,'cls1'),('xiaoer','m',22,'cls3'),('zhangsan','w',21,'cls5'),('lisi','m',20,'cls4'),('wangwu','w',26,'cls6');
Query OK, 5 rows affected (0.08 sec)
Records: 5 Duplicates: 0 Warnings: 0

mysql> select * from member;
---- ----------- ----- ----- ---------
| id | name | sex | age | classid |
---- ----------- ----- ----- ---------
| 1 | wangshibo | m | 27 | cls1 |
| 2 | guohuihui | w | 27 | cls2 |
| 3 | yiyi | w | 20 | cls1 |
| 4 | xiaoer | m | 22 | cls3 |
| 5 | zhangsan | w | 21 | cls5 |
| 6 | lisi | m | 20 | cls4 |
| 7 | wangwu | w | 26 | cls6 |
---- ----------- ----- ----- ---------
7 rows in set (0.00 sec)

3)

正午又施行了校订数据操作:

mysql> update ops.member set name='李四' where id=4;
Query OK, 1 row affected (0.07 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> update ops.member set name='小二' where id=2;
Query OK, 1 row affected (0.06 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from member;
---- ----------- ----- ----- ---------
| id | name | sex | age | classid |
---- ----------- ----- ----- ---------
| 1 | wangshibo | m | 27 | cls1 |
| 2 | 小二 | w | 27 | cls2 |
| 3 | yiyi | w | 20 | cls1 |
| 4 | 李四 | m | 22 | cls3 |
| 5 | zhangsan | w | 21 | cls5 |
| 6 | lisi | m | 20 | cls4 |
| 7 | wangwu | w | 26 | cls6 |
---- ----------- ----- ----- ---------
7 rows in set (0.00 sec)

4)

在早上18:00的时候,正剧莫明其妙的面世了!

手贱奉行了drop语句,直接删除了ops库!吓尿!
mysql> drop database ops;
Query OK, 1 row affected (0.02 sec)

5)

这种时候,一定不要恐慌!!!

先细心查阅最终三个binlog日志,并记录下主要的pos点,到底是哪些pos点的操作变成了数据库的磨损(平日在结尾几步);

先备份一下最终一个binlog日志文件:
[root@vm-002 ~]# cd /var/lib/mysql/
[root@vm-002 mysql]# cp -v mysql-bin.000003 /opt/backup/
`mysql-bin.000003' -> `/opt/backup/mysql-bin.000003'
[root@vm-002 mysql]# ls /opt/backup/
mysql-bin.000003 ops_2016-09-25.sql.gz

进而实施叁次刷新日志索引操作,重新伊始新的binlog日志记录文件。按理说mysql-bin.000003

本条文件不会再有继续写入了,因为低价大家解析原因及搜索ops节点,以往全数数据库操作都会写入到下叁个日记文件。

mysql> flush logs;
Query OK, 0 rows affected (0.13 sec)

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

6)

读取binlog日志,深入分析难点。
读取binlog日志的秘技方面已经谈到。

方法一:使用mysqlbinlog读取binlog日志:

[root@vm-002 ~]# cd /var/lib/mysql/
[root@vm-002 mysql]# mysqlbinlog mysql-bin.000003

方法二:登陆服务器,并查阅(推荐此种方法)

mysql> show binlog events in 'mysql-bin.000003';

------------------ ----- ------------- ----------- ------------- ----------------------------------------------------------------------------------------------------------------------------
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
------------------ ----- ------------- ----------- ------------- ----------------------------------------------------------------------------------------------------------------------------
| mysql-bin.000003 | 4 | Format_desc | 1 | 106 | Server ver: 5.1.73-log, Binlog ver: 4 |
| mysql-bin.000003 | 106 | Query | 1 | 173 | BEGIN |
| mysql-bin.000003 | 173 | Intvar | 1 | 201 | INSERT_ID=3 |
| mysql-bin.000003 | 201 | Query | 1 | 444 | use `ops`; insert into ops.member(`name`,`sex`,`age`,`gsan','w',21,'cls5'),('lisi','m',20,'cls4'),('wangwu','w',26,'cls6') |
| mysql-bin.000003 | 444 | Xid | 1 | 471 | COMMIT /* xid=66 */ |
| mysql-bin.000003 | 471 | Query | 1 | 538 | BEGIN |
| mysql-bin.000003 | 538 | Query | 1 | 646 | use `ops`; update ops.member set name='李四' where id= |
| mysql-bin.000003 | 646 | Xid | 1 | 673 | COMMIT /* xid=68 */ |
| mysql-bin.000003 | 673 | Query | 1 | 740 | BEGIN |
| mysql-bin.000003 | 740 | Query | 1 | 848 | use `ops`; update ops.member set name='小二' where id= |
| mysql-bin.000003 | 848 | Xid | 1 | 875 | COMMIT /* xid=69 */ |
| mysql-bin.000003 | 875 | Query | 1 | 954 | drop database ops |
| mysql-bin.000003 | 954 | Rotate | 1 | 997 | mysql-bin.000004;pos=4 |
------------------ ----- ------------- ----------- ------------- ----------------------------------------------------------------------------------------------------------------------------
13 rows in set (0.00 sec)

或者:

mysql> show binlog events in 'mysql-bin.000003'G;
.........
.........
*************************** 12. row ***************************
Log_name: mysql-bin.000003
Pos: 875
Event_type: Query
Server_id: 1
End_log_pos: 954
Info: drop database ops
*************************** 13. row ***************************
Log_name: mysql-bin.000003
Pos: 954
Event_type: Rotate
Server_id: 1
End_log_pos: 997
Info: mysql-bin.000004;pos=4
13 rows in set (0.00 sec)

通过剖析,变成数据库破坏的pos点区间是介于 875--954 以内(那是依照日志区间的pos节点算的卡塔 尔(阿拉伯语:قطر‎,只要苏醒到875前就可。

7)

先把深夜4点全备份的数据恢复:
[root@vm-002 ~]# cd /opt/backup/
[root@vm-002 backup]# ls
mysql-bin.000003 ops_2016-09-25.sql.gz
[root@vm-002 backup]# gzip -d ops_2016-09-25.sql.gz
[root@vm-002 backup]# mysql -uroot -p -v < ops_2016-09-25.sql

Enter password:

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT

*/


/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS

*/

.............
.............


/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */

这么就过来了以至于当日晚上(4:00)前的备份数据都过来了。

mysql> show databases;                        #发觉ops库已经过来回来了
mysql> use ops;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
---------------
| Tables_in_ops |
---------------
| member |
---------------
1 row in set (0.00 sec)

mysql> select * from member;
---- ----------- ----- ----- ---------
| id | name | sex | age | classid |
---- ----------- ----- ----- ---------
| 1 | wangshibo | m | 27 | cls1 |
| 2 | guohuihui | w | 27 | cls2 |
---- ----------- ----- ----- ---------
2 rows in set (0.00 sec)

mysql>

不过那仅仅只是复苏了当天清晨4点事先的数目,在4:00--18:00以内的数码还尚无过来回来!!
咋做吧?
莫慌!那能够依照前面提到的mysql-bin.000003的新binlog日志实行还原。

8)

从binlog日志苏醒数据
还原命令的语法格式:
mysqlbinlog mysql-bin.0000xx | mysql -u客户名 -p密码 数据库名


常用参数选项解释:
--start-position=875 起始pos点
--stop-position=954 结束pos点
--start-datetime="二〇一五-9-25 22:01:08" 起头时间点
--stop-datetime="2019-9-25 22:09:46" 甘休时间点
--database=zyyshop 钦赐只回复zyyshop数据库(生机勃勃台主机上一再有多少个数据库,只限当地log日志)


不时用选项:
-u --user=name 连接到长途主机的客商名
-p --password[=name] 连接到远程主机的密码
-h --host=name 从远程主机上收获binlog日志

--read-from-remote-server 从有个别MySQL服务器上读取binlog日志

小结:实际是将读出的binlog日志内容,通过管道符传递给mysql命令。这个命令、文件尽量写成相对路线;

a卡塔尔完全苏醒(需求手动vim编辑mysql-bin.000003,将那条drop语句剔除掉)

[root@vm-002 backup]# /usr/bin/mysqlbinlog /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops

b卡塔 尔(阿拉伯语:قطر‎钦命pos截止点苏醒(部分恢复生机):

--stop-position=471 pos结束节点(遵照事务区间算,是471卡塔 尔(英语:State of Qatar)

注意:

此pos甘休节点介于“member表原始数据”与更新“name='李四'”以前的数量,那样就足以过来到改进“name='李四'”在此之前的数目了。

操作如下:

[root@vm-002 ~]# /usr/bin/mysqlbinlog --stop-position=471 --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops

mysql> select * from member;
---- ----------- ----- ----- ---------
| id | name | sex | age | classid |
---- ----------- ----- ----- ---------
| 1 | wangshibo | m | 27 | cls1 |
| 2 | guohuihui | w | 27 | cls2 |
| 3 | yiyi | w | 20 | cls1 |
| 4 | xiaoer | m | 22 | cls3 |
| 5 | zhangsan | w | 21 | cls5 |
| 6 | lisi | m | 20 | cls4 |
| 7 | wangwu | w | 26 | cls6 |
---- ----------- ----- ----- ---------
7 rows in set (0.00 sec)

还原截至到修改“name='李四'”之间的数量(根据事务区间算,是673卡塔尔

[root@vm-002 ~]# /usr/bin/mysqlbinlog --stop-position=673 --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops

mysql> select * from member;
---- ----------- ----- ----- ---------
| id | name | sex | age | classid |
---- ----------- ----- ----- ---------
| 1 | wangshibo | m | 27 | cls1 |
| 2 | guohuihui | w | 27 | cls2 |
| 3 | yiyi | w | 20 | cls1 |
| 4 | 李四 | m | 22 | cls3 |
| 5 | zhangsan | w | 21 | cls5 |
| 6 | lisi | m | 20 | cls4 |
| 7 | wangwu | w | 26 | cls6 |
---- ----------- ----- ----- ---------
7 rows in set (0.00 sec)

c卡塔尔钦定pso点区间回复(部分复苏):

更新 name='李四' 那条数据,日志区间是Pos[538] --> End_log_pos[646],按工作区间是:Pos[471] --> End_log_pos[673]

更新 name='小二' 那条数据,日志区间是Pos[740] --> End_log_pos[848],按职业区间是:Pos[673] --> End_log_pos[875]

c1)

单身复苏 name='李四' 那步操作,可这样:

根据binlog日志区间单独复苏:

[root@vm-002 ~]# /usr/bin/mysqlbinlog --start-position=538 --stop-position=646 --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops

依据业务区间单独恢复生机
[root@vm-002 ~]# /usr/bin/mysqlbinlog --start-position=471 --stop-position=673 --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops

c2)

单身恢复生机 name='小二' 那步操作,可那般:
依据binlog日志区间单独苏醒:
[root@vm-002 ~]# /usr/bin/mysqlbinlog --start-position=740 --stop-position=848 --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops

信守作业区间单独复苏
[root@vm-002 ~]# /usr/bin/mysqlbinlog --start-position=673 --stop-position=875 --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops

c3)

将 name='李四'、name='小二' 多步操作一齐过来,须要按事务区间,可这样:
[root@vm-002 ~]# /usr/bin/mysqlbinlog --start-position=471 --stop-position=875 --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops

查阅数据库:

mysql> select * from member;
---- ----------- ----- ----- ---------
| id | name | sex | age | classid |
---- ----------- ----- ----- ---------
| 1 | wangshibo | m | 27 | cls1 |
| 2 | 小二 | w | 27 | cls2 |
| 3 | yiyi | w | 20 | cls1 |
| 4 | 李四 | m | 22 | cls3 |
| 5 | zhangsan | w | 21 | cls5 |
| 6 | lisi | m | 20 | cls4 |
| 7 | wangwu | w | 26 | cls6 |
---- ----------- ----- ----- ---------
7 rows in set (0.00 sec)

诸如此比,就借尸还魂了除去前的数据状态了!!

另外:

也可指定期期节点区间复苏(部分恢复生机):
除此而外用pos节点的点子开展回复,也得以因此点名时间节点区间展开苏醒,准时间复苏要求用mysqlbinlog命令读取binlog日志内容,找时间节点。

如上,误删除ops库后:

先实行全备份恢复生机
[root@vm-002 backup]# mysql -uroot -p -v < ops_2016-09-25.sql

查看ops数据库

mysql> select * from member;
---- ----------- ----- ----- ---------
| id | name | sex | age | classid |
---- ----------- ----- ----- ---------
| 1 | wangshibo | m | 27 | cls1 |
| 2 | guohuihui | w | 27 | cls2 |
---- ----------- ----- ----- ---------
2 rows in set (0.00 sec)

mysql>

翻开mysq-bin00003日志,找寻时间节点

[root@vm-002 ~]# cd /var/lib/mysql
[root@vm-002 mysql]# mysqlbinlog mysql-bin.000003
.............
.............
BEGIN
/*!*/;
# at 173
#160925 21:57:19 server id 1 end_log_pos 201 Intvar
SET INSERT_澳门新浦京娱乐场网站:mysql数据库误删除操作表明。ID=3/*!*/;
# at 201
#160925 21:57:19 server id 1 end_log_pos 444 Query thread_id=3 exec_time=0 error_code=0
use `ops`/*!*/;
SET TIMESTAMP=1474811839/*!*/;
insert into ops.member(`name`,`sex`,`age`,`classid`) values('yiyi','w',20,'cls1'),('xiaoer','m',22,'cls3'),('zhangsan','w',21,'cls5'),('lisi','m',20,'cls4'),('wangwu','w',26,'cls6')                               #执行的sql语句
/*!*/;
# at 444
#160925 21:57:19 server id 1 end_log_pos 471 Xid = 66    #发端推行的日子
COMMIT/*!*/;
# at 471
#160925 21:58:41 server id 1 end_log_pos 538 Query thread_id=3 exec_time=0 error_code=0    #停止时间
SET TIMESTAMP=1474811921/*!*/;
BEGIN
/*!*/;
# at 538
#160925 21:58:41 server id 1 end_log_pos 646 Query thread_id=3 exec_time=0 error_code=0
SET TIMESTAMP=1474811921/*!*/;
update ops.member set name='李四' where id=4     #执行的sql语句
/*!*/;
# at 646
#160925 21:58:41 server id 1 end_log_pos 673 Xid = 68    #始于实行的流年
COMMIT/*!*/;
# at 673
#160925 21:58:56 server id 1 end_log_pos 740 Query thread_id=3 exec_time=0 error_code=0   #完工作时间间
SET TIMESTAMP=1474811936/*!*/;
BEGIN
/*!*/;
# at 740
#160925 21:58:56 server id 1 end_log_pos 848 Query thread_澳门新浦京娱乐场网站:mysql数据库误删除操作表明。id=3 exec_time=0 error_code=0
SET TIMESTAMP=1474811936/*!*/;
update ops.member set name='小二' where id=2      #执行的sql语句
/*!*/;
# at 848
#160925 21:58:56 server id 1 end_log_pos 875 Xid = 69   #始发奉行的时间
COMMIT/*!*/;
# at 875
#160925 22:01:08 server id 1 end_log_pos 954 Query thread_id=3 exec_time=0 error_code=0    #结束时间
SET TIMESTAMP=1474812068/*!*/;
drop database ops
/*!*/;
# at 954
#160925 22:09:46 server id 1 end_log_pos 997 Rotate to mysql-bin.000004 pos: 4
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

还原到纠正“name='李四'”以前的数码

[root@vm-002 ~]# /usr/bin/mysqlbinlog --start-datetime="2016-09-25 21:57:19" --stop-datetime="2016-09-25 21:58:41" --

database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops

mysql> select * from member;
---- ----------- ----- ----- ---------
| id | name | sex | age | classid |
---- ----------- ----- ----- ---------
| 1 | wangshibo | m | 27 | cls1 |
| 2 | guohuihui | w | 27 | cls2 |
| 3 | yiyi | w | 20 | cls1 |
| 4 | xiaoer | m | 22 | cls3 |
| 5 | zhangsan | w | 21 | cls5 |
| 6 | lisi | m | 20 | cls4 |
| 7 | wangwu | w | 26 | cls6 |
---- ----------- ----- ----- ---------
7 rows in set (0.00 sec)

[root@vm-002 ~]# /usr/bin/mysqlbinlog --start-datetime="2016-09-25 21:58:41" --stop-datetime="2016-09-25 21:58:56" --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops
mysql> select * from member;
---- ----------- ----- ----- ---------
| id | name | sex | age | classid |
---- ----------- ----- ----- ---------
| 1 | wangshibo | m | 27 | cls1 |
| 2 | guohuihui | w | 27 | cls2 |
| 3 | yiyi | w | 20 | cls1 |
| 4 | 李四 | m | 22 | cls3 |
| 5 | zhangsan | w | 21 | cls5 |
| 6 | lisi | m | 20 | cls4 |
| 7 | wangwu | w | 26 | cls6 |
---- ----------- ----- ----- ---------
7 rows in set (0.00 sec)

[root@vm-002 ~]# /usr/bin/mysqlbinlog --start-datetime="2016-09-25 21:58:56" --stop-datetime="2016-09-25 22:01:08" --database=ops /var/lib/mysql/mysql-bin.000003 | /usr/bin/mysql -uroot -p123456 -v ops
mysql> select * from member;
---- ----------- ----- ----- ---------
| id | name | sex | age | classid |
---- ----------- ----- ----- ---------
| 1 | wangshibo | m | 27 | cls1 |
| 2 | 小二 | w | 27 | cls2 |
| 3 | yiyi | w | 20 | cls1 |
| 4 | 李四 | m | 22 | cls3 |
| 5 | zhangsan | w | 21 | cls5 |
| 6 | lisi | m | 20 | cls4 |
| 7 | wangwu | w | 26 | cls6 |
---- ----------- ----- ----- ---------
7 rows in set (0.00 sec)

如此,就东山再起了剔除前的情形了!

总结:

所谓复苏,正是让mysql将保存在binlog日志中内定段落区间的sql语句各种重新实行叁回而已。

以上那篇演讲mysql之binlog日志以致接纳binlog日志复苏数据的措施便是作者分享给我们的全体内容了,希望能给大家叁个参谋,也指望大家多都赐教脚本之家。

你可能感兴趣的篇章:

  • Mysql数据库之Binlog日志使用总结(非看不可篇)
  • Linux上通过binlog文件恢复生机mysql数据库详细步骤
  • MySQL数据库遭到抨击窜改(使用备份和binlog举办数据苏醒)
  • Mysql Binlog急忙遍历寻觅记录及binlog数据查看的点子
  • 教您活动还原MySQL数据库的日志文件(binlog)
  • MySQL数据库复苏(使用mysqlbinlog命令)
  • Mysql Binlog数据查看的方法精解

本文由澳门新浦京娱乐场网站发布于数据库,转载请注明出处:澳门新浦京娱乐场网站:mysql数据库误删除操作表