• [mysqlbinlog]记生产中利用binlog数据恢复一例


    情况描述:

    时间2013-11-11 18:21:04分; dba在数据维护的时候,误删除了某张表。删除之后马上又创建了同样的表,这样后续的数据写入就不用恢复了

    处理步骤:

    找到了2013-11-11 02:00:00分的mysqldump数据完整的备份(pay.full.sql) + 02:00:00时备份数据库时flush-logs的binlog(mysql-bin.000085:记录着2点之后新增的数据):增量备份就是基于binlog做的

    1. 刷新下binlog

    mysqladmin -uroot -pyangcan flush-logs

    2. 导出binlog在误删之前的数据,注意时间可以通过先查看在确定

    mysqlbinlog -d pay --stop-datetime='2013-11-11 18:21:04' mysql-bin.000085 > ok1.sql

    3. 因为特殊情况是不能直接在生产中直接恢复数据(因为binlog里面只能精确到某个库,而不能精确到某个表,如果全部导入,必然是不能这样操作的); 我的处理方法是把数据文件+binlog下载到本地去恢复,完成之后在把本地的数据导出来,在导回到生产中;

    在本地操作:如果导入数据中出错,请使用-f参数忽略错误,强制导入

    mysql -uroot -pyangcan pay < pay.full.sql
    mysql -uroot -pyangcan -f pay < ok1.sql

    4.  这样就得到了pay误删之前的数据了。下面我们只需要恢复误删的paylog表即可,

    注意:采用的是表结构和数据分开的方式,因为现在生产中的数据是一件在写入数据的。主键自增,不可能按insert的方式插入数据了

    mkdir /tmp/paylog
    chown mysql:mysql /tmp/paylog
    mysqldump -uroot -pyangcan --tab=/tmp/paylog/ pay paylog

    5. 把得到的paylog.txt 上传到服务器;在服务器导入数据,这里跳过了id自增的列

    load data infile '/tmp/ok/paylog.txt' into table pay.paylog(@id,orderid,money,gold,orderdate,spid,server,user,char,flags);

     


    6. 其他

    mysqlbinlog常用参数:
    --start-datetime
    --stop-datetime
    --start-position
    --stop-position
    -d --database=name ,指定只显示指定数据库的binlog信息;但仅限于读本地的binlog
    --force : 当master正在写二进制日志,所以需要加--force

    # 远程读取binlog
    [root@localhost ~]# mysqlbinlog --force-read --read-from-remote-server -uptcheck -p -h192.168.100.33 --start-datetime='2013-08-21 16:00:00' --stop-datetime='2013-08-21 16:10:00' slave-bin.000001

     

    mysqldump常用参数:

    # database 导出
    Usage: mysqldump [OPTIONS] database [tables]
    OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
    OR mysqldump [OPTIONS] --all-databases [OPTIONS]

    --skip-add-drop-table
    --skip-add-drop-database
    --add-drop-table       (默认)
    --add-drop-database     (默认)   

    # 不增加create database
    -n, --no-create-db # 在指定了--databases 或 --all-databases 时可用, 可以指定不创建数据库语句
    CREATE DATABASE /*!32312 IF NOT EXISTS*/ `repl_test` /*!40100 DEFAULT CHARACTER SET utf8 */;

    # 不复制数据
    -d, --no-data No row information.

    # 不创建表
    -t, --no-create-info
    # 导出存储过程
    -R, --routines Dump stored routines (functions and procedures).
    -E, --events
    --triggers
    --default-character-set=name 字符集设置

    # 关于分隔符号
    --fields-terminated-by=name
    --fields-enclosed-by=name
    --fields-escaped-by=name
    --fields-optionally-enclosed-by=name
    --lines-terminated-by=name

    -F, --flush-logs && use --lock-all-tables or --master-data with --flush-logs.
    --ignore-table=repl_test.checksums 
    -l, --lock-tables Lock all tables for read. # 锁表,默认是on

    --opt Same as --add-drop-table, --add-locks, --create-options,--quick, --extended-insert, --lock-tables, --set-charset,and --disable-keys. Enabled by default, disable with
    --skip-opt.

    --delete-master-logs      : 执行备份后删除二进制日志
    --ignore-table=db.tb1     : 跳过某些表,需要是db.tbname
    --lock-all-tables        : 在dump中锁定所有数据库中的所有表
    --lock-tables          : 在包含表前锁定所有表
    --single-transaction        : 在数据slave中导出之前执行begine sql语句,这允许innodb表的一致性快照
    --master-date={0|1|2}

    # 只复制表结构
    mysqldump -uroot -p -d -R -E --triggers --databases test > test.schema.sql
    # 复制表的数据和表的结构分开
    [root@localhost ~]# mysqldump -R -E --triggers --tab=/tmp/data/ repl_test
    [root@localhost data]# mysqldump --fields-terminated-by=@ --fields-enclosed-by=" --tab=/tmp/data/ repl_test


    mysql> load data infile '/tmp/data/school.txt' into table t1 FIELDS TERMINATED BY ',' (@dropid,name);
    enclosed by '"';


  • 相关阅读:
    bzoj 2784: [JLOI2012]时间流逝【树形期望dp】
    bzoj 3566: [SHOI2014]概率充电器【树形概率dp】
    bzoj 5277: [Usaco2018 Open]Out of Sorts【冒泡排序瞎搞】
    【04】在 PR 中关闭 issue
    【03】代码格式化+高亮
    【02】粘贴图像
    【01】在 Github 上编辑代码
    【02】GitHub 工具 Octotree
    【01】恶趣味玩转 GitHub commit 历史记录
    【07】Firebug监控网络情况
  • 原文地址:https://www.cnblogs.com/yoncan/p/3419073.html
Copyright © 2020-2023  润新知