zoukankan      html  css  js  c++  java
  • MySQL备份与还原

    大学时候写的文章,再用一下

    MySQL常见备份方案有以下三种:

    • mysqldump + binlog
    • lvm + binlog
    • xtrabackup

    mysqldump

    本例为方便演示,数据库里面数据为空。下面开始动手

    mkdir /opt/backup                                #创建备份目录
    mkdir -p /data/3309/{data,binlog}     
    cd /usr/local/mysql/
    scripts/mysql_install_db --user=mysql --datadir=/data/3309/data/ --basedir=/usr/local/mysql/ 
    chown mysql.mysql -R /data/3309/ 
    cp support-files/my-small.cnf /data/3309/my.cnf   #提供配置文件
    
    vim /data/3309/my.cnf                             #编辑配置文件
    [client]
    #password       = your_password
    port            = 3309
    socket          = /tmp/mysql.sock4
    # The MySQL server
    [mysqld]
    port            = 3309
    socket          = /tmp/mysql.sock4
    skip-external-locking
    key_buffer_size = 16K
    max_allowed_packet = 1M
    table_open_cache = 4
    sort_buffer_size = 64K
    read_buffer_size = 256K
    read_rnd_buffer_size = 256K
    net_buffer_length = 2K
    thread_stack = 128K
    datadir = /data/3309/data
    server-id       = 3309
    log-bin=/data/3309/binlog/mysql-bin   #二进制日志位置
    binlog_format=mixed               #二进制日志格式
    log-error = /data/3309/mysql-err       #错误日志位置 
    innodb_file_per_table = 1            #为每一个新数据表创建一个表空间文件
    sync_binlog = 1                    #写二进制日志的时候,同步到磁盘上面
    
    cp /data/3309/my.cnf /opt/backup/   #备份配置文件
    mysqld_safe --defaults-file=/data/3309/my.cnf &  #启动mysql
    

    1、利用mysqldump完全备份mysql,配合二进制日志备份实现增量备份

    mysqldump 选项请参考http://wangweiak47.blog.51cto.com/2337362/1589304

    1.1提供模拟数据

    mysql -S /tmp/mysql.sock4   #连接mysql
    mysql> use test;
    Database changed
    mysql> create table test (id int(2),comment char(30));  #创建表
    Query OK, 0 rows affected (0.34 sec)
     
    mysql> insert into test values (1,'yun zhonghe');  #插入数据
    Query OK, 1 row affected (0.16 sec)
    

    1.2全量备份:

    mysqldump -S /tmp/mysql.sock4 -A -B -F -x --events --triggers --routines --master-data=2 > /opt/backup/all_data-`date +%F--%U`.sql
    

    1.3 模拟数据发生改变

    mysql> insert into test values (2,'yun zhonghe2');    #再插入一条数据。
    Query OK, 1 row affected (0.11 sec)
    

    1.4 增量备份

    mysqladmin -S /tmp/mysql.sock4 flush-logs   #增量备份前,先滚动一下二进制日志。
    cp `cat /data/3309/binlog/mysql-bin.index | tail -n 2 | head -n 1` /opt/backup/   #备份二进制日志

    mysqlbinlog -d t1 --stop-position=2439  master-bin.000014>test.sql(执行这条语句竟然报错了)

    WARNING: The option --database has been used. It may filter parts of transactions, but will include the GTIDs in any case. If you want to exclude or include transactions, you should use the options --exclude-gtids or --include-gtids, respectively, instead.
    暂时弄不清楚原因,百度了下修改成:

    mysqlbinlog master-bin.000014 -d t1  --skip-gtids --stop-position=2439>test.sql


    -d:参数是指定某个数据库日志 

    命令意思是将master-bin.000014日志文件内的T1数据库日志,事件点2439之前的日志,输出到test.sql

    # tail test.sql

    看看文件最后几行

    1.5 数据损坏

    rm -rf /data/3309/
    killall mysqld
    

    1.6 恢复

    上面已经提供了步骤,直接复制过来使用。

    mkdir -p /data/3309/{data,binlog}
    cd /usr/local/mysql/
    scripts/mysql_install_db --user=mysql --datadir=/data/3309/data/ --basedir=/usr/local/mysql/
    cp /opt/backup/my.cnf /data/3309/
    chown mysql.mysql -R /data/3309/
    mysqld_safe --defaults-file=/data/3309/my.cnf &    
    
    mysql -S /tmp/mysql.sock4     #连接mysql查看数据
    mysql> set sql_log_bin=0;
    Query OK, 0 rows affected (0.00 sec)
     
    mysql> show variables like 'sql_log_bin';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | sql_log_bin   | OFF   |
    +---------------+-------+
    1 row in set (0.00 sec)
     
    mysql> source /opt/backup/all_data-2015-10-01--39.sql
     
    mysql> select * from test.test;   #还缺一个数据
    +------+-------------+
    | id   | comment     |
    +------+-------------+
    |    1 | yun zhonghe |
    +------+-------------+
    1 row in set (0.00 sec)  
     
    mysql> source /tmp/incres-1.sql;
     
    mysql> select * from test.test;   #数据已恢复
    +------+--------------+
    | id   | comment      |
    +------+--------------+
    |    1 | yun zhonghe  |
    |    2 | yun zhonghe2 |
    +------+--------------+
    2 rows in set (0.00 sec)
     
    mysql> set sql_log_bin = 1;  #打开二进制记录开关。
    

    1.7小结,mysqldump适合于数据量较小的场合,它的优点是有众多选项,使用起来非常灵活,缺点是数据量一旦过大,非常耗时耗力。

    使用lvm进行全备。

    lvm快照卷原理参考,lvm

    2.1 数据接着上次继续开始。

    2.2 全备。

    需保证数据库存放在逻辑卷组上面,才行。

    2.2.1首先锁表和滚动日志

    mysql> flush table with read lock;
    Query OK, 0 rows affected (0.02 sec)
     
    mysql -S /tmp/mysql.sock4 -e 'show master status;' > /backup/master.info  #记录当前日志信息
    mysqladmin -S /tmp/mysql.sock4 flush-logs   #滚动日志
    

    2.2.2创建快照

    lvcreate -s -n snap_data -L 500M /dev/vg_node5/mylv_data
      Logical volume "snap_data" created
    

    2.2.3 解锁表

    mysql> unlock tables;  
    Query OK, 0 rows affected (0.00 sec)
    

    2.2.4 复制快照卷数据到备份目录下

    mkdir -p /backup/lvm
    mount /dev/vg_node5/snap_data /mnt/lvm
    cp -R /mnt/3309/* /backup/lvm
    

    2.2.5 删除快照

    umount /mnt
    lvremove /dev/mapper/vg_node5-snap_data
    Do you really want to remove active logical volume snap_data? [y/n]: y
      Logical volume "snap_data" successfully removed
    

    2.3增量备份,只需和定时复制binlog到备份目录下面即可

    2.4恢复,只需要直接拷贝备份目录下的文件即可

    killall mysqld
    rm -rf /data/3309/
    cp -R /backup/lvm/ /data/3309/
    chown mysql.mysql -R /data/3309/
    mysqld_safe --defaults-file=/data/3309/my.cnf &
    ss -tnl | grep 330
    LISTEN     0      50                        *:3309                     *:* 
     
    mysql> select * from test.test;   #数据未改变
    +------+--------------+
    | id   | comment      |
    +------+--------------+
    |    1 | yun zhonghe  |
    |    2 | yun zhonghe2 |
    +------+--------------+
    

    2.5小结:

    lvm实现物理备份速度相对mysqldump来比较快,实现也比较简单,是不错的选择。

    缺点:数据目录必须存放在lvm卷组上面

    XtraBackup

    3、使用xtrabackup实现热备。

    请自行到官网下载并安装对应的rpm包。

    使用方法参考:详细参考:

    http://www.cnblogs.com/Amaranthus/archive/2014/08/19/3922570.html

    3.1创建一个具有最小权限的用户

    mkdir /backup/xtrabackup
    mysql> grant RELOAD, LOCK TABLES, REPLICATION CLIENT on *.* to 'bkuser'@'localhost' identified by '123456';
    mysql> flush privileges;
    

    3.2完全热备。

    使用innobakupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。这些文件会被保存至一个以时间命令的目录中。

    innobackupex --user=bkuser --password=123456 --socket=/tmp/mysql.sock4 --defaults-file=/data/3309/my.cnf /backup/xtrabackup/ #相关选项自行help。
    #nnobackupex: completed OK! #出现此选项代表备份完成。
    ls /backup/xtrabackup/
    2015-10-01_17-00-13
    

    (1)xtrabackup_checkpoints —— 备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息;

    每个InnoDB页(通常为16k大小)都会包含一个日志序列号,即LSN。LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的。

    (2)xtrabackup_binlog_info —— mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置。

    (3)xtrabackup_binlog_pos_innodb —— 二进制日志文件及用于InnoDB或XtraDB表的二进制日志文件的当前position。

    (4)xtrabackup_binary —— 备份中用到的xtrabackup的可执行文件;

    (5)backup-my.cnf —— 备份命令用到的配置选项信息;

    3.3提供改变数据。

    mysql> insert into test.test values (3,'yun zhonghe3');
    Query OK, 1 row affected (0.03 sec)
    

    3.4增量备份

    innobackupex --user=bkuser --password=123456 --socket=/tmp/mysql.sock4 --defaults-file=/data/3309/my.cnf --incremental /backup/xtrabackup/ --incremental-basedir=/backup/xtrabackup/2015-10-01_17-00-13/
    

    3.5 模拟数据损坏

    rm -rf /data/3309/
    killall mysqld
    

    3.6增量备份恢复

    innobackupex --apply-log --redo-only /backup/xtrabackup/2015-10-01_17-00-13/
    innobackupex --apply-log --redo-only /backup/xtrabackup/2015-10-01_17-00-13/ --incremental-dir=/backup/xtrabackup/2015-10-01_17-15-00/
    

    #注意,多实例的话,仍然需要备份配置文件,启动的时候需要binlog目录。

    mkdir -p /data/3309/{data,binlog}
    chown mysql.mysql -R /data/
    cp /opt/backup/my.cnf /data/3309/
    innobackupex --copy-back /backup/xtrabackup/2015-10-01_17-00-13/ --defaults-file=/opt/backup/my.cnf   #恢复数据。
    

    3.6启动数据库查看。

    mysqld_safe --defaults-file=/data/3309/my.cnf &
    mysql -S /tmp/mysql.sock4
    mysql> select * from test.test;   #数据修复完成。
    +------+--------------+
    | id   | comment      |
    +------+--------------+
    |    1 | yun zhonghe  |
    |    2 | yun zhonghe2 |
    |    3 | yun zhonghe3 |
    +------+--------------+
    3 rows in set (0.01 sec)
    

    小结:

    xtrabacup具有如下特点。

    • 备份过程快速、可靠;
    • 备份过程不会打断正在执行的事务;
    • 能够基于压缩等功能节约磁盘空间和流量;
    • 自动实现备份检验;
    • 还原速度快;

    因此建议学会熟练使用xtrabackup进行备份和还原。

    最后



    作者:Real_man
    链接:https://www.jianshu.com/p/d767d76d1836
    来源:简书

  • 相关阅读:
    SQL语法:查询此表有另外一个表没有的数据
    .NET平台开源项目速览-最快的对象映射组件Tiny Mapper之项目实践
    win7 64 安装Oracle 11G 、使用PLSQL进行连接 标准实践
    json 筛选数据 $.grep过滤数据
    bootstrap table 行号 显示行号 添加行号 bootstrap-table 行号
    ajax 请求二进制流 图片 文件 XMLHttpRequest 请求并处理二进制流数据 之最佳实践
    JS中判断JSON数据是否存在某字段的方法 JavaScript中判断json中是否有某个字段
    json 数字key json 数字作为主键
    ajax 跨域 headers JavaScript ajax 跨域请求 +设置headers 实践
    扩展:gridview 空数据时显示表头
  • 原文地址:https://www.cnblogs.com/cheyunhua/p/10709015.html
Copyright © 2011-2022 走看看