zoukankan      html  css  js  c++  java
  • MySQL mysqldump备份与恢复

    1 用户权限

    grant select,RELOAD,PROCESS,SUPER, REPLICATION CLIENT ON *.* TO 'bak'@'192.168.%' IDENTIFIED BY "**";

    2 mysqldump 备份

    2.1利用mysqldump进行全备份

    --A 全备
    /usr/local/mysql/bin/mysqldump -h 127.0.0.1 -usystem -p'***' -A -R -S /data/mysqldata/3306/mysql.sock
    --single-transaction --default-character-set=utf8 --master-data=2 | gzip > /data/mysqldata/backup/mysqldump/mysqldumpfullbk_20170301.sql.gz

    --set global general_log=1
    查看mysqldump的原理,flush tables with read lock;短暂的一致性,不支持写,支持读,
    snapshot,unlock tables,时间很短
    --参数--single-transaction --master-data=2 --default-character-set=utf8
    --会先对所有数据库的所有表上锁,读取binlog的信息之后就立即释放锁,这个过程是十分短暂的。然后整个导出过程都在一个事务里.
    --慢查询会阻塞flush table,ddl也会

    --db.table 针对数据和表

    /usr/local/mysql/bin/mysqldump -usystem -p -h127.0.0.1 -P3306 test a
    --single-transaction --master-data=2 --default-character-set=utf8 -q
    | gzip > /data/mysqldata/test_a`date +'%Y%m%d'`.sql.gz


    --db.tables 多个表
    /usr/local/mysql/bin/mysqldump -usystem -p -h127.0.0.1 -P3306 test a b
    --single-transaction --master-data=2 --default-character-set=utf8 -q
    | gzip > /data/mysqldata/test_a`date +'%Y%m%d%H'`.sql.gz


    -- dbs 多个库
    /usr/local/mysql/bin/mysqldump -usystem -p -h127.0.0.1 -P3306 -B test bi1
    --single-transaction --master-data=2 --default-character-set=utf8 -q
    | gzip > /data/mysqldata/test_a`date +'%Y%m%d%H%m'`.sql.gz

    2.2 全库恢复

    [mysql@mysql-5635 mysqldump]$ gunzip mysqldumpfullbk_20170301.sql.gz
    [mysql@mysql-5635 mysqldump]$ ll
    total 2272
    -rw-rw-r-- 1 mysql mysql 2323927 Mar 1 07:21 mysqldumpfullbk_20170301.sql
    --全库恢复
    [mysql@mysql-5635 mysqldump]$ mysql -usystem -p*** -h127.0.0.1 -P3306 <mysqldumpfullbk_20170301.sql

    2.3 增量恢复

    在全备份后进行插入数据,然后删除表等操作

    mysql> insert into yhq_t1 values(2,'BBBBBB');
    Query OK, 1 row affected (0.04 sec)

    mysql> commit;
    Query OK, 0 rows affected (0.00 sec)
    mysql> truncate table yhq_t1 ;
    Query OK, 0 rows affected (0.05 sec)

    在上全库恢复后只有1条数据

    mysql> select * from yhq_t1 ;
    +------+-------+
    | id | name |
    +------+-------+
    | 1 | AAAAA |
    +------+-------+

    --增量恢复,利用binlog
    --可以类似查询

    mysql> system ls /data/mysqldata/3306/binlog/
    mysql> show binlog events in 'mysql-bin.000011';

    mysql> show master status;

    [mysql@mysqlhq scripts]$ mysqlbinlog --help #可以根据帮助文档,查询mysqlbinlog支持的参数,常用的 -d,start-datetime,start-position,stop-datetime等

    $ mysqlbinlog -d test -vv mysql-bin.000011 >/tmp/mysqlbin07.txt #找到对应的binlog文件

    $ mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS mysql-bin.000011--stop-datetime="2017-08-31 07:19:33" --start-datetime="2017-08-31 07:17:33"  >/tmp/test0732.sql

    $ mysql -usystem  -p*** -h127.0.0.1  -P3306  </tmp/test0732.sql

    --如果有多个binlog需要恢复,就类似这样,然后在导入

    shell> mysqlbinlog binlog.000001 > /tmp/statements.sql
    shell> mysqlbinlog binlog.000002 >> /tmp/statements.sql

    Point-in-Time (Incremental) Recovery Using the Binary Log
    1 Point-in-Time Recovery Using Event Times
    为了指示要恢复的开始和结束时间,指定的mysqlbinlog可以--start - datetime和--stop -日期时间选择,在DATETIME格式。
    举个例子,假设在2005年4月20日,正是在上午10点的SQL语句被执行的删除一个大表。
    要恢复表和数据,你可以恢复前一天晚上的备份,然后执行以下命令
    shell> mysqlbinlog --stop-datetime="2005-04-20 9:59:59"
    /var/log/mysql/bin.123456 | mysql -u root -p
    这个命令恢复所有的数据直到--stop-datetime指定的时间
    如果没有检测已输入直到小时后,错误的SQL语句,你可能还需要恢复之后发生的活动。
    shell> mysqlbinlog --start-datetime="2005-04-20 10:01:00"
    /var/log/mysql/bin.123456 | mysql -u root -p
    要使用点及时恢复的这种方法,您应检查日志,以确保准确的时间到指定的命令。为了不执行它们显示日志文件的内容,请使用以下命令
    shell> mysqlbinlog /var/log/mysql/bin.123456 > /tmp/mysql_restore.sql
    Then open the /tmp/mysql_restore.sql file with a text editor to examine it.

    2 Point-in-Time Recovery Using Event Positions
    --start-position and --stop-position
    shell> mysqlbinlog --start-datetime="2005-04-20 9:55:00"
    --stop-datetime="2005-04-20 10:05:00"
    /var/log/mysql/bin.123456 > /tmp/mysql_restore.sql
    用文本编辑器打开该文件,寻找你不要想重复的语句。确定二进制日志的位置停止和恢复恢复,
    使他们的注释。位置被标记为log_pos后跟一个数字。恢复以前的备份文件后,使用位置编号来处理二进制日志文件。
    shell> mysqlbinlog --stop-position=368312 /var/log/mysql/bin.123456
    | mysql -u root -p

    shell> mysqlbinlog --start-position=368315 /var/log/mysql/bin.123456
    | mysql -u root -p

    drop table用mysqldump恢复
    drop table恢复测试
    1 create table t_d/insert
    2 mysqldump -A
    3 insert into t_d/drop
    --恢复操作
    1 mysqldump中恢复到备份时刻
    2 根据binlog位置点,恢复到drop的位置点
    --test
    (system@127.0.0.1:3306) [test]> select * from t_d;
    +---+
    | a |
    +---+
    | 1 |
    | 2 |
    | 4 |
    | 5 |
    mysqldump
    insert into t_d values (6),(7),(8);
    (system@127.0.0.1:3306) [test]> select * from t_d;
    +---+
    | a |
    +---+
    | 1 |
    | 2 |
    | 4 |
    | 5 |
    | 6 |
    | 7 |
    | 8 |
    drop table t_d

    mysql mysql 101305262 Oct 31 01:05 allDatabase_20171031.sql.gz
    $ gunzip allDatabase_20171031.sql.gz
    $ head -50 allDatabase_20171031.sql
    -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000078', MASTER_LOG_POS=154;

    [mysql@mysql1 logical]$ sed -e'/./{H;$!d;}' -e 'x;/CREATE TABLE `t_d`/!d;q' allDatabase_20171031.sql

    ROP TABLE IF EXISTS `t_d`;
    /*!40101 SET @saved_cs_client = @@character_set_client */;
    /*!40101 SET character_set_client = utf8 */;
    CREATE TABLE `t_d` (
    `a` int(11) NOT NULL,
    PRIMARY KEY (`a`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    /*!40101 SET character_set_client = @saved_cs_client */;
    [mysql@mysql1 logical]$ grep 'INSERT INTO `t_d`' allDatabase_20171031.sql>t_d_bak20171031.sql
    [mysql@mysql1 logical]$ cat t_d_bak20171031.sql
    INSERT INTO `t_d` VALUES (1),(2),(4),(5);

    (system@127.0.0.1:3306) [test]> select * from t_d;
    +---+
    | a |
    +---+
    | 1 |
    | 2 |
    | 4 |
    | 5 |
    +---+

    [mysql@mysql1 binlog]$ mysqlbinlog -v -v --base64-output=DECODE-ROWS --set-charset=UTF8 --start-position=154 /data/mysqldata/3306/binlog/mysql-bin.000078 |grep DROP -A10 -B10
    # at 1630230
    #171031 2:10:32 server id 20170814 end_log_pos 1630261 CRC32 0xdf5c044f Xid = 6032638
    COMMIT/*!*/;
    # at 1630261
    #171031 2:10:31 server id 20170814 end_log_pos 1630326 CRC32 0xbe0887b7 Anonymous_GTID last_committed=4148 sequence_number=4149
    SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
    # at 1630326
    #171031 2:10:31 server id 20170814 end_log_pos 1630442 CRC32 0x91db776e Query thread_id=635196 exec_time=1 error_code=0
    use `test`/*!*/;
    SET TIMESTAMP=1509387031/*!*/;
    DROP TABLE `t_d` /* generated by server */
    /*!*/;
    # at 1630442
    #171031 2:10:33 server id 20170814 end_log_pos 1630507 CRC32 0x84362a1f Anonymous_GTID last_committed=4149 sequence_number=4150
    SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
    # at 1630507
    #171031 2:10:33 server id 20170814 end_log_pos 1630581 CRC32 0x9ba1d726 Query thread_id=14 exec_time=0 error_code=0
    SET TIMESTAMP=1509387033/*!*/;
    BEGIN
    /*!*/;
    # at 1630581
    --删除事件1630442,我们要恢复到这个之前,也就是1630326这个事件
    [mysql@mysql1 binlog]$ mysqlbinlog -v -v --base64-output=DECODE-ROWS --set-charset=UTF8 --start-position=154 --stop-position=1630326
    /data/mysqldata/3306/binlog/mysql-bin.000078 > db_test_t_d20171031.sql

    -----
    '/*!*/;
    ### INSERT INTO `test`.`t_d`
    ### SET
    ### @1=6 /* INT meta=0 nullable=0 is_null=0 */
    ### INSERT INTO `test`.`t_d`
    ### SET
    ### @1=7 /* INT meta=0 nullable=0 is_null=0 */
    ### INSERT INTO `test`.`t_d`
    ### SET
    ### @1=8 /* INT meta=0 nullable=0 is_null=0 */
    # at 1619713
    #171031 2:10:03 server id 20170814 end_log_pos 1619744 CRC32 0xc7b1762a Xid = 6032401
    COMMIT/*!*/;

    3 mysqldump 日志

    -----------
    show master status;
    show variables like 'general_log';
    show variables like 'log_output';
    show variables like 'general_log_file';
    set global general_log=on;
    set global log_output='table';
    set global log_output='file';
    show create table mysql.general_log;
    select command_type,argument from mysql.general_log order by event_time desc;
    delete from mysql.general_log;
    set global general_log=off;
    -----------
    2017-09-28T22:42:26.099799Z 357112 Query show variables like 'general_log_file'
    2017-09-28T22:42:56.854552Z 370024 Connect system@127.0.0.1 on using TCP/IP
    2017-09-28T22:42:56.855764Z 370024 Query /*!40100 SET @@SQL_MODE='' */
    2017-09-28T22:42:56.856766Z 370024 Query /*!40103 SET TIME_ZONE='+00:00' */
    2017-09-28T22:42:56.857718Z 370024 Query FLUSH /*!40101 LOCAL */ TABLES
    2017-09-28T22:42:56.875349Z 370024 Query FLUSH TABLES WITH READ LOCK
    2017-09-28T22:42:56.876115Z 370024 Query SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
    2017-09-28T22:42:56.876737Z 370024 Query START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */
    2017-09-28T22:42:56.877350Z 370024 Query SHOW VARIABLES LIKE 'gtid\_mode'
    2017-09-28T22:42:56.883794Z 370024 Query SHOW MASTER STATUS
    2017-09-28T22:42:56.884410Z 370024 Query UNLOCK TABLES
    FROM INFORMATION_SCHEMA.PARTITIONS
    FROM INFORMATION_SCHEMA.FILES
    2017-09-28T22:42:56.936366Z 370024 Query SHOW VARIABLES LIKE 'ndbinfo\_version'
    2017-09-28T22:42:56.938931Z 370024 Init DB test
    2017-09-28T22:42:56.939138Z 370024 Query SHOW CREATE DATABASE IF NOT EXISTS `test`
    2017-09-28T22:42:56.939242Z 370024 Query SAVEPOINT sp
    2017-09-28T22:42:56.939331Z 370024 Query show tables
    2017-09-28T22:42:56.939917Z 370024 Query show table status like 'BatchTemp'
    2017-09-28T22:42:56.940558Z 370024 Query SET SQL_QUOTE_SHOW_CREATE=1
    2017-09-28T22:42:56.940618Z 370024 Query SET SESSION character_set_results = 'binary'
    2017-09-28T22:42:56.940755Z 370024 Query show create table `BatchTemp`
    2017-09-28T22:42:56.941053Z 370024 Query SET SESSION character_set_results = 'utf8'
    2017-09-28T22:42:56.941321Z 370024 Query show fields from `BatchTemp`
    2017-09-28T22:42:56.942625Z 370024 Query show fields from `BatchTemp`
    2017-09-28T22:42:56.943093Z 370024 Query SELECT /*!40001 SQL_NO_CACHE */ * FROM `BatchTemp`
    2017-09-28T22:42:56.948903Z 370024 Query SET SESSION character_set_results = 'binary'
    2017-09-28T22:42:56.949070Z 370024 Query use `test`
    2017-09-28T22:42:56.949250Z 370024 Query select @@collation_database
    2017-09-28T22:42:56.949513Z 370024 Query SHOW TRIGGERS LIKE 'BatchTemp'
    2017-09-28T22:42:56.950046Z 370024 Query SET SESSION character_set_results = 'utf8'
    2017-09-28T22:42:56.950190Z 370024 Query ROLLBACK TO SAVEPOINT sp

  • 相关阅读:
    TP5.x——打印SQL语句
    PHP——运行shell命令|脚本
    Git——取消merge状态
    Typecho——简介及安装
    Vue——服务器上部署vue.js
    Node——服务器上安装Node.js
    PHP——敏感词过滤
    PHP——emjoin表情存入数据库
    什么是脚本语言
    全局拦截各种http请求
  • 原文地址:https://www.cnblogs.com/yhq1314/p/9936537.html
Copyright © 2011-2022 走看看