zoukankan      html  css  js  c++  java
  • mysql数据库-备份与还原实操


    备份工具

    1. cp, tar等复制归档工具:物理备份工具,适用所有存储引擎;只支持冷备;完全和部分备份
    2. LVM的快照:先加读锁,做快照后解锁,几乎热备;借助文件系统工具进行备份
    3. mysqldump:逻辑备份工具,适用所有存储引擎,对MyISAM存储引擎进行温备;支持完全或部分备份;对InnoDB存储引擎支持热备,结合binlog的增量备份
    4. xtrabackup:由Percona提供支持对InnoDB做热备(物理备份)的工具,支持完全备份、增量备份
    5. MariaDB Backup: 从MariaDB 10.1.26开始集成,基于Percona XtraBackup 2.3.8实现
    6. mysqlbackup:热备份, MySQL Enterprise Edition组件
    7. mysqlhotcopy:PERL 语言实现,几乎冷备,仅适用于MyISAM存储引擎,使用LOCK TABLES、FLUSH TABLES和cp或scp来快速备份数据库

    1 基于 LVM 的快照备份(几乎热备)

    # 1. 锁定所有表
    mysql> FLUSH TABLES WITH READ LOCK;
    # 2. 记录二进制日志文件及事件位置
    mysql> FLUSH LOGS;
    mysql> SHOW MASTER STATUS;
    mysql -e 'SHOW MASTER STATUS' > /PATH/TO/FILE
    # 3. 创建快照
    lvcreate -L # -s -p r -n NAME /DEV/VG_NAME/LV_NAME
    # 4. 释放锁
    mysql> UNLOCK TABLES;
    # 5. 挂载快照卷,执行数据备份
    # 6. 备份完成后,删除快照卷
    # 7. 制定好策略,通过原卷备份二进制日志
    

    2 数据库冷备份和还原

    # 1. 关停要备份的DB
     systemctl stop mariadb
    # 2. 复制相关数据文件(配置文件、数据文件、binlog)到远程主机
     scp /etc/my.cnf.d/mariadb-server.cnf ${Restore_Machine}:/etc/my.cnf.d/
     rsync -avz /var/lib/mysql/ ${Restore_Machine}:/var/lib/mysql/  #保留属性复制数据文件
     scp -r /data/logbin/ ${Restore_Machine}:/data/  #${Restore_Machine}事先存在/data/目录
    # 3. 在目标主机(${Restore_Machine})上修改文件属主信息
     chown -R mysql.mysql /var/lib/mysql/
     chown -R mysql.mysql /data/logbin/
    # 4. 启动还原完数据的DB
     systemctl start mariadb
    

    3 mysqldump备份工具

    mysqldump是MySQL的客户端命令,通过mysql协议连接至mysql服务器进行备份
    Schema和数据存储在一起、巨大的SQL语句、单个巨大的备份文件
    官方mysqldump介绍页面 https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html

    3.1 实战备份策略

    3.1.1 全备份

    • InnoDB建议备份策略
    # 直接全量备份
    mysqldump –uroot -p –A –F –E –R --triggers --single-transaction --master-data=1 --flush-privileges --default-character-set=utf8 --hex-blob >${BACKUP}/fullbak_${BACKUP_TIME}.sql
    
    # 全量分库备份,不备份MySQL自带的信息数据库
    mysql -uroot -e 'show databases'|grep -Ev '^(Database|information_schema|performance_schema)$'|while read db;do mysqldump -B $db | gzip > /data/$db.sql.gz;done
    
    # for db in `mysql -uroot -e 'show databases'|grep -Ev '^(Database|information_schema|performance_schema)$'`;do mysqldump -B $db | gzip > /data/$db.sql.gz;done
    
    # mysql -uroot -e 'show databases'|grep -Ev '^(Database|information_schema|performance_schema)$' | sed -rn 's#(.*)#mysqldump -B 1 | gzip > /data/1.sql.gz#p' |bash
    
    # mysql -uroot -e 'show databases'|sed -rn '/^(Database|information_schema|performance_schema)$/!s#(.*)#mysqldump -B 1 | gzip > /data/1.sql.gz#p' |bash
    
    • MyISAM建议备份策略
    mysqldump –uroot -p –A –F –E –R –x --master-data=1 --flush-privileges --triggers --default-character-set=utf8 --hex-blob > ${BACKUP}/fullbak_${BACKUP_TIME}.sql
    

    3.1.2 分库分表备份

    # cat backup_hellodb.sh
    #!/bin/bash
    TIME=`date +%F_%H-%M-%S`
    DIR=/backup
    DB=hellodb
    PASS=123456
    [ -d "$DIR" ] || mkdir $DIR
    
    mysqldump -uroot -p "$PASS" -F –E –R --triggers  --single-transaction --master-data=2 --default-character-set=utf8 -q -B $DB | gzip >  ${DIR}/${DB}_${TIME}.sql.gz
    

    3.2 mysqldump 备份常见选项

    -A, --all-databases #备份所有数据库,含create database
    -B, --databases db_name…  #指定备份的数据库,包括create database语句
    -E, --events:#备份相关的所有event scheduler
    -R, --routines:#备份所有存储过程和自定义函数
    --triggers:#备份表相关触发器,默认启用,用--skip-triggers,不备份触发器
    --default-character-set=utf8 #指定字符集
    --master-data[=#]: #此选项须启用二进制日志
    #1:所备份的数据之前加一条记录为CHANGE MASTER TO语句,非注释,不指定#,默认为1,适合于主从复制多机使用
    #2:记录为被注释的#CHANGE MASTER TO语句,适合于单机使用
    #此选项会自动关闭--lock-tables功能,自动打开-x | --lock-all-tables功能(除非开启--single-transaction)
    -F, --flush-logs #备份前滚动日志,锁定表完成后,执行flush logs命令,生成新的二进制日志文件,配合-A 或 -B 选项时,会导致刷新多次数据库。建议在同一时刻执行转储和日志刷新,可通过和--single-transaction或-x,--master-data 一起使用实现,此时只刷新一次二进制日志
    --compact #去掉注释,适合调试,生产不使用
    -d, --no-data #只备份表结构,不备份数据
    -t, --no-create-info #只备份数据,不备份表结构,即create table
    -n,--no-create-db #不备份create database,可被-A或-B覆盖
    --flush-privileges #备份mysql或相关时需要使用
    -f, --force    #忽略SQL错误,继续执行
    --hex-blob     #使用十六进制符号转储二进制列,当有包括BINARY, VARBINARY,BLOB,BIT的数据类型的列时使用,避免乱码
    -q, --quick   #不缓存查询,直接输出,加快备份速度
    

    3.3 mysqldump的MyISAM存储引擎相关的备份选项

    MyISAM不支持事务,只能支持温备;不支持热备,所以必须先锁定要备份的库,而后启动备份操作

    -x,--lock-all-tables #加全局读锁,锁定所有库的所有表,同时加--single-transaction或--lock-tables选项会关闭此选项功能,注意:数据量大时,可能会导致长时间无法并发访问数据库
    -l,--lock-tables #对于需要备份的每个数据库,在启动备份之前分别锁定其所有表,默认为on,--skip-lock-tables选项可禁用,对备份MyISAM的多个库,可能会造成数据不一致
    #注:以上选项对InnoDB表一样生效,实现温备,但不推荐使用
    

    3.4 mysqldump的InnoDB存储引擎相关的备份选项

    InnoDB 存储引擎支持事务,可以利用事务的相应的隔离级别,实现热备,也可以实现温备但不建议用

    --single-transaction
    #此选项Innodb中推荐使用,不适用MyISAM,此选项会开始备份前,先执行START TRANSACTION指令开启事务
    #此选项通过在单个事务中转储所有表来创建一致的快照。 仅适用于存储在支持多版本控制的存储引擎中的表(目前只有InnoDB可以); 转储不保证与其他存储引擎保持一致。 在进行单事务转储时,要确保有效的转储文件(正确的表内容和二进制日志位置),没有其他连接应该使用以下语句:ALTER TABLE,DROPTABLE,RENAME TABLE,TRUNCATE TABLE,此选项和--lock-tables(此选项隐含提交挂起的事务)选项是相互排斥,备份大型表时,建议将--single-transaction选项和--quick结合一起使用
    

    4 mysql完全备份和还原

    4.1 常规备份方法

    # 1. 开启源DB二进制日志
    vim /etc/mariadb-server.cnf
    [mysqld]
    log-bin
    # log-bin=/data/mysql/mysql-bin
    
    # 2. 备份源DB
    mysqldump -uroot -p123456 -A -F --single-transaction --master-data=2 |gzip > /backup/all-`date +%F`.sql.gz
    
    # 3. 还原目标DB准备
    gzip -d all-2019-11-27.sql.gz
    
    # 4. 开始目标DB的还原
    mysql> set sql_log_bin=off;
    mysql> source /backup/all-2000-01-01.sql
    mysql> set sql_log_bin=on;
    
    /data/scripts/backup.sh
    #!/usr/bin/bash
    #0 1 1 * * sh /data/scripts/backup.sh
    DT=`date -d "-1 years" +%Y-%m-%d`
    DB_USER="mysql_user"
    DB_PASS="12344321"
    DB_HOST="adsfc.mysql.rds.aliyuncs.com"
    SQL="mysql -u${DB_USER} -p${DB_PASS} -h${DB_HOST}"
    TAB_BK_DIR="/data/backups"
    DDT="adfxxxzxdfad"
    DELETE="DELETE FROM calc_user_bi_log WHERE date <= ${DT}; "
    
    mysqldump -u${DB_USER} -p${DB_PASS} -h${DB_HOST} --set-gtid-purged=OFF --where="date <= ${DT};" calc_crm calc_user_bi_log > ${TAB_BK_DIR}/calc_user_bi_log_${DT}.sql
    if [ $? -eq 0 ]; then
        echo "DELETE FROM calc_user_bi_log WHERE date <= ${DT};" > /tmp/delete.sql
    #    mysql  -u${DB_USER} -p${DB_PASS} -h${DB_HOST} calc_crm < /tmp/delete.sql
    else
        echo "backup f"
    	/usr/bin/python /data/jenkins/scripts/DingDing.py ${DDT} "calc_user_bi_log backup failure"
    fi
    

    4.2 利用二进制日志,实现秒精度数据库数据恢复

    4.3 xtrabackup备份工具使用

  • 相关阅读:
    HDU 2757 Ocean Currents
    HDU 2704 Bulletin Board
    HDU 2234 无题I
    HDU 3638 Go , SuSu
    HDU 1199 Color the Ball
    HDU 1430 魔板
    PL/SQL例外的介绍
    表分区介绍
    移动表空间数据文件
    long\lob\bfile类型介绍
  • 原文地址:https://www.cnblogs.com/firewalld/p/14814079.html
Copyright © 2011-2022 走看看