
假设你之前进行了
mysqldump全量备份,和binlog增量备份(在mysqldump全量备份时使用参数--flush-logs清除全量备份前的binlog).
先恢复之前用mysqldump进行的全量备份,然后用
mysqlbinlog进行时间点还原:
?
1
2
mysql
-uroot
-prootpwd
db_name
<
db_name.sql
mysqlbinlog
--stop-datetime="2013-10-12
12:30:00"
/var/log/mysql/mysql-bin.000001
|
mysql
-uroot
-prootpwd
这里假设你的误 *** 作发生在
2013-10-12
12:30:00之后.
如果你既没有进行mysqldump全量备份,也没有开启binlog安全日志,那真的就悲剧了.
delete 忘加where条件误删除恢复(binglog格式必须是ROW)
1.模拟误删除数据
mysql> select * from t1+----+-------+-----+-----------+
| id | name | sex | address |
+----+-------+-----+-----------+
| 1 | daiiy | m | guangzhou |
| 2 | tom | f | shanghai |
| 3 | liany | m | beijing |
| 4 | lilu | m | zhuhai |
+----+-------+-----+-----------+
rows in set (0.00 sec)
mysql> delete from t1
Query OK, 4 rows affected (0.03 sec)
mysql> select * from t1
Empty set (0.00 sec)
mysql>
2、在binglog中去查找相关记录
[root@localhost mysql]# mysqlbinlog --no-defaults --base64-output=decode-rows -v -v mysql-bin.000024 | sed -n '/### DELETE FROM db01.t1/,/COMMIT/p' > delete.txt[root@localhost mysql]# cat delete.txt
### DELETE FROM db01.t1
### WHERE
### @1=1 /* INT meta=0 nullable=0 is_null=0 */
### @2='daiiy' /* STRING(60) meta=65084 nullable=0 is_null=0 */
### @3=2 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */
### @4='guangzhou' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
### DELETE FROM db01.t1
### WHERE
### @1=2 /* INT meta=0 nullable=0 is_null=0 */
### @2='tom' /* STRING(60) meta=65084 nullable=0 is_null=0 */
### @3=1 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */
### @4='shanghai' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
### DELETE FROM db01.t1
### WHERE
### @1=3 /* INT meta=0 nullable=0 is_null=0 */
### @2='liany' /* STRING(60) meta=65084 nullable=0 is_null=0 */
### @3=2 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */
### @4='beijing' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
### DELETE FROM db01.t1
### WHERE
### @1=4 /* INT meta=0 nullable=0 is_null=0 */
### @2='lilu' /* STRING(60) meta=65084 nullable=0 is_null=0 */
### @3=2 /* ENUM(1 byte) meta=63233 nullable=0 is_null=0 */
### @4='zhuhai' /* VARSTRING(90) meta=90 nullable=0 is_null=0 */
# at 2719
#140305 11:41:00 server id 1 end_log_pos 2746 Xid = 78
COMMIT/*!*/
[root@localhost mysql]#
3、将记录转换成sql语句
[root@localhost mysql]# cat delete.txt | sed -n '/###/p' | sed 's/### //gs/\/\*.*/,/gs/DELETE FROM/INSERT INTO/gs/WHERE/SELECT/g' | sed -r 's/(@4.*),/\1/g' | sed 's/@[1-9]=//g' > t1.sql[root@localhost mysql]# cat t1.sql
INSERT INTO db01.t1
SELECT
,
'daiiy' ,
,
'guangzhou'
INSERT INTO db01.t1
SELECT
,
'tom' ,
,
'shanghai'
INSERT INTO db01.t1
SELECT
,
'liany' ,
,
'beijing'
INSERT INTO db01.t1
SELECT
,
'lilu' ,
,
'zhuhai'
[root@localhost mysql]#
4、导入数据,验证数据完整性。
mysql> source t1.sqlQuery OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
Query OK, 1 row affected (0.02 sec)
Records: 1 Duplicates: 0 Warnings: 0
Query OK, 1 row affected (0.02 sec)
Records: 1 Duplicates: 0 Warnings: 0
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> select * from t1
ERROR 1046 (3D000): No database selected
mysql> select * from db01.t1
+----+-------+-----+-----------+
| id | name | sex | address |
+----+-------+-----+-----------+
| 1 | daiiy | m | guangzhou |
| 2 | tom | f | shanghai |
| 3 | liany | m | beijing |
| 4 | lilu | m | zhuhai |
+----+-------+-----+-----------+
rows in set (0.00 sec)
mysql>
到这里数据就完整回来了。
将binglog格式设置为row有利有弊,好处是记录了每一行的实际变化,在主从复制时也不容易出问题。但是由于记录每行的变化,会占用大量磁盘,主从复制时带宽占用会有所消耗。到底是使用row还是mixed,需要在实际工作中自己去衡量,但从整体上来说,binglog的格式设置为row,都是不二的选择
你写了一条正常的update 或者 delete 语句时,语句本身是没问题的,但是却执行不了。原因是是MySQL Workbench的安全设置。当要执行的SQL语句是进行批量更新或者删除的时候就会提示这个错误。打开Workbench的菜单Edit->Preferences xxx->切换到SQL Editor
把Forbid UPDATE and DELETE statements without a WHERE clause (safe updates)的勾去掉击[OK]按钮重新启动就OK了。
或者在每句语句前,加上‘SET SQL_SAFE_UPDATES=0’
问题就解决了。
(ps:以后我会分享我所遇到的问题,这里持续更新!)
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)