zoukankan      html  css  js  c++  java
  • MySQL备份和恢复[3]-mysqldump备份工具

    mysqldump

    概述

    逻辑备份工具:

    • mysqldump, mydumper, phpMyAdmin
    • Schema和数据存储在一起、巨大的SQL语句、单个巨大的备份文件
    • mysqldump:是MySQL的客户端命令,通过mysql协议连接至mysql服务器进行备份
    • 配合标准输出重定向导入到一个文件里面去。
    • 依赖数据库服务的

    命令格式

    mysqldump [OPTIONS] database [tables] #支持指定数据库和指定多表的备份,但数据库本身定义不备份
    mysqldump [OPTIONS] –B DB1 [DB2 DB3...] #支持指定数据库备份,包含数据库本身定义也会备份
    mysqldump [OPTIONS] –A [OPTIONS] #备份所有数据库,包含数据库本身定义也会备份
    

    常用选项

    -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 #不缓存查询,直接输出,加快备份速度
    

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

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

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

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

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

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

    生产环境实战备份策略

    InnoDB建议备份策略

    mysqldump –uroot -p –A –F –E –R --single-transaction --master-data=1 --flushprivileges
    --triggers --default-character-set=utf8 --hex-blob
    >${BACKUP}/fullbak_${BACKUP_TIME}.sql
    

    -A 就全都包括了,mysql就都包括了
    --master-data=1,有主从配置

    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
    

    mysqldump 备份还原实战案例

    实战案例:特定数据库的备份脚本

    [root@centos8 ~]#cat backup_hellodb.sh
    #!/bin/bash
    TIME=`date +%F_%H-%M-%S`
    DIR=/backup
    DB=hellodb
    PASS=magedu
    mysqldump -uroot -p "$PASS" -F --single-transaction --master-data=2 --defaultcharacter-
    set=utf8 -q -B $DB | gzip > ${DIR}/${DB}_${TIME}.sql.gz
    

    实战案例:分库备份并压缩

    [root@centos8 ~]#mysql -uroot -e 'show databases'|sed -rn
    '/^(Database|information_schema|performance_schema)$/!s#(.*)#mysqldump -B 1 |
    gzip > /data/1.sql.gz#p' |bash
    [root@centos8 ~]#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
    [root@centos8 ~]#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
    [root@centos8 ~]#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
    [root@centos8 ~]#cat backup_db.sh
    #!/bin/bash
    TIME=`date +%F_%H-%M-%S`
    DIR=/backup
    PASS=magedu
    [ -d "$DIR" ] || mkdir $DIR
    for DB in `mysql -uroot -p "$PASS" -e 'show databases' | grep -Ev
    "^Database|.*schema$"`;do
    mysqldump -F --single-transaction --master-data=2 --default-characterset=
    utf8 -q -B $DB | gzip > ${DIR}/${DB}_${TIME}.sql.gz
    done
    

    实战案例:完全备份和还原

    #开启二进制日志
    [root@centos8 ~]#vim /etc/my.cnf.d/mariadb-server.cnf
    [mysqld]
    log-bin
    #备份
    [root@centos8 ~]#mysqldump -uroot -pmagedu -A -F --single-transaction --masterdata=
    2 |gzip > /backup/all-`date +%F`.sql.gz
    #还原
    [root@centos8 backup]#dnf install mariadb-server
    [root@centos8 backup]#gzip -d all-2019-11-27.sql.gz
    [root@centos8 ~]#mysql
    MariaDB [(none)]> set sql_log_bin=off;
    MariaDB [(none)]> source /backup/all-2019-11-27.sql
    MariaDB [(none)]> set sql_log_bin=on;
    

    实战案例:利用二进制日志,还原数据库最新状态

    #二进制日志独立存放
    [mysqld]
    log-bin=/data/mysql/mysql-bin
    #完全备份,并记录备份的二进制位置
    mysqldump -uroot -pmagedu -A -F --default-character-set=utf8 --singletransaction
    --master-data=2 | gzip > /backup/all_`date +%F`.sql.gz
    #修改数据库
    insert students (name,age,gender)value('mage',20,'M');
    insert students (name,age,gender)value('wang',22,'M');
    #损坏数据库
    rm -rf /var/lib/mysql/*
    #还原
    cd /backup
    gzip -d all_2019-11-25.sql.gz
    #CentOS 8 需要事先生成数据库相关文件,CentOS7 不需要执行此步
    mysql_install_db --user=mysql
    systemctl restart mariadb
    MariaDB [(none)]> show master logs;
    +------------------+-----------+
    | Log_name | File_size |
    +------------------+-----------+
    | mysql-bin.000001 | 998 |
    | mysql-bin.000002 | 28090 |
    | mysql-bin.000003 | 342 |
    +------------------+-----------+
    3 rows in set (0.000 sec)
    MariaDB [(none)]>set sql_log_bin=0;
    MariaDB [(none)]>source /data/all_2019-11-25.sql
    [root@centos8 ~]#grep '^-- CHANGE MASTER TO' /data/all_2019-11-25.sql
    -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=328;
    #二进制日志的备份
    [root@centos8 mysql]#mysqlbinlog mysql-bin.000001 --start-position=328 >
    /backup/inc.sql
    [root@centos8 mysql]#mysqlbinlog mysql-bin.000002 >> /backup/inc.sql
    MariaDB [(none)]>set sql_log_bin=0;
    MariaDB [(none)]>source /backup/inc.sql
    MariaDB [(none)]>set sql_log_bin=1;
    

    实战案例:mysqldump 和二进制日志结合实现增量备份

    [root@centos8 ~]#mysqldump -uroot -p -A -F --single-transaction --master-data=2
    |gzip > /backup/all-`date +%F`.sql.gz
    #观察备份文件中的二进制文件和位置,将之后的二进制日志进行复制备份
    [root@centos8 ~]#cp /var/lib/mysql/mariadb-bin.000003 /backup
    [root@centos8 ~]#mysqlbinlog --start-position=389 /backup/mariadb-bin.000003 >
    /backup/inc.sql
    

    实战案例:恢复误删除的表

    案例说明:每天2:30做完全备份,早上10:00误删除students,10:10才发现故障,现需要将数据
    库还原到10:10的状态,且恢复被删除的students表

    #完全备份
    [root@centos8 ~]#mysqldump -uroot -p -A -F --single-transaction --master-data=2
    > /backup/allbackup_`date +%F_%T`.sql
    [root@centos8 ~]#ll /backup/
    total 2992
    -rw-r--r-- 1 root root 3060921 Nov 27 10:20 allbackup_2019-11-27_10:20:08.sql
    #完全备份后数据更新
    MariaDB [testdb]> insert students (name,age,gender) values('rose',20,'f');
    Query OK, 1 row affected (0.001 sec)
    MariaDB [testdb]> insert students (name,age,gender) values('jack',22,'M');
    Query OK, 1 row affected (0.001 sec)
    #10:00误删除了一个重要的表
    MariaDB [testdb]> drop table students;
    Query OK, 0 rows affected (0.021 sec)
    #后续其它表继续更新
    MariaDB [testdb]> use hellodb;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    Database changed
    MariaDB [hellodb]> insert teachers (name,age,gender)values('wang',30,'M');
    Query OK, 1 row affected (0.002 sec)
    MariaDB [hellodb]> insert teachers (name,age,gender)values('mage',28,'M');
    Query OK, 1 row affected (0.002 sec)
    MariaDB [hellodb]> select * from teachers;
    +-----+---------------+-----+--------+
    | TID | Name | Age | Gender |
    +-----+---------------+-----+--------+
    | 1 | Song Jiang | 45 | M |
    | 2 | Zhang Sanfeng | 94 | M |
    rows in set (0.001 sec)
    #10:10发现表删除,进行还原
    #停止数据库访问
    #从完全备份中,找到二进制位置
    [root@centos8 ~]#grep '-- CHANGE MASTER TO' /backup/allbackup_2019-11-
    27_10:20:08.sql
    -- CHANGE MASTER TO MASTER_LOG_FILE='mariadb-bin.000003', MASTER_LOG_POS=389;
    #备份从完全备份后的二进制日志
    [root@centos8 ~]#mysqlbinlog --start-position=389 /var/lib/mysql/mariadbbin.
    000003 > /backup/inc.sql
    #找到误删除的语句,从备份中删除此语句,如果文件过大,可以使用sed实现
    [root@centos8 ~]#vim /data/inc.sql
    #DROP TABLE `student_info` /* generated by server */
    #利用完全备份和修改过的二进制日志进行还原
    [root@centos8 ~]#mysql -uroot -p
    MariaDB [hellodb]> set sql_log_bin=0;
    MariaDB [hellodb]> source /backup/allbackup_2019-11-27_10:20:08.sql;
    MariaDB [hellodb]> source /backup/inc.sql
    MariaDB [hellodb]> set sql_log_bin=1;
    

    无论是哪种还原,都是要停服务的。
    只要装客户端,就集成在包里。

    挑一个表来备份
    挑一个库来备份
    挑整个来备份
    和mysql一样,需要敲用户名和密码

    未完待续……又挖一个坑

    * * * 胖并快乐着的死肥宅 * * *
  • 相关阅读:
    定位小结
    定位知识点
    css属性书写顺序
    清除浮动及清除浮动的方法
    margin合并和塌陷问题
    css特性-层叠性,继承性,优先级
    css属性简写
    css布局之双飞翼布局
    css布局之圣杯布局
    css布局之等高布局
  • 原文地址:https://www.cnblogs.com/bpzblog/p/13098708.html
Copyright © 2011-2022 走看看