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

    1. 备份数据的意义
    针对不同业务,7*24小时提供服务和数据的重要性不同。
    数据库数据是比较核心的数据,对企业的经营至关重要,数据库备份显得尤为重要。

    2. 备份数据库
    MySQL数据库自带的备份命令 `mysqldump`,基本使用方法:
    语法:`mysqldump -u username -p password dbname > filename.sql`

    执行备份命令
    `mysqldump -uroot -pmysqladmin db_test > /opt/mysql_bak.sql`

    查看备份内容
    `grep -v "#|*|--|^$" /opt/mysql_bak.sql`

    > 导出的格式没有加字符集,会出现乱码,一般恢复到数据库会正常。INSERT语句是批量插入的方式,这样恢复的效率会更高。

    指定对应的字符集备份,默认字符集为 `default-character-set=latinl`
    `mysqldump -uroot -p'mysqladmin' --default-character-set=latinl db_test > /opt/mysql_bak.sql`

    恢复数据
    `mysql -uroot -p'mysqladmin' db_test < /opt/mysql_bak.sql`

    参数`-B`的使用
    `mysqldump -uroot -pmysqladmin -B db_test > /opt/mysql_bak_B.sql`
    > 使用 -B 参数的作用是增加创建数据库和连接数据的命令。即:
    CREATE DATABASE /*!32312 IF NOT EXISTS*/`db_test`
    USE `db_test`;
    恢复的时候也不用指定库名称。

    优化备份文件大小减少输出注释
    利用`mysqldump`的`--compact`参数优化备份结果

    --compact参数说明:
    优化输出内容,输出更简洁,适合调试。
    --skip-add-drop-table
    --no-set-names
    --skip-disable-keys
    --skip-add-locks

    指定压缩命令压缩备份MySQl数据
    `mysqldump -uroot -p'mysqladmin' -B db_test|gzip > /opt/mysql_bak.sql.gz`

    ```
    1. 导出数据用`-B`参数(带创建数据库语句)
    2. 使用 `|gzip` 对数据进行压缩
    ```

    3. mysqldump备份原理
    mysqldump 实际上就是把数据以sql语句的形式直接输出。(逻辑备份)
    恢复的过程就是把sql文件进行执行。

    4. 备份多个库
    `mysqldump -uroot -p'mysqladmin' -B db_test db_test1 |gzip > /opt/all_bak.sql.gz`

    -B(--database) 参数是关键,表示连接多个库,并且增加 `CREATE DATABASE db_name` 、 `USE db_name`的信息。

    -B 后的参数将被作为数据库名,该参数较常用。
    当 -B 后的数据库全部列出时,同 -A 参数。

    5. 分库备份
    分库备份实际上就是将每个库执行一条命令单独备份,使用对应的库名作为备份文件,以`.sql` 结尾。备份多个库的命令如下:

    1. 查询所有的数据库
    `mysql -uroot -p'mysqladmin' -e "show databases;" |grep -Evi "database|info|perfor"`

    2. 在所有库之前加上备份命令
    `mysql -uroot -p'mysqladmin' -e "show databases;" |grep -Evi "database|info|perfor" | sed 's#^#mysqldump -uroot -p'mysqladmin' -B #g'`

    3. 将备份内容输出到文件
    `mysql -uroot -p'mysqladmin' -e "show databases;" |grep -Evi "database|info|perfor" | sed -r 's#^([a-z].*$)#mysqldump -uroot -p'mysqladmin' -B 1|gzip > /opt/1.sql.gz#g'`

    4. 执行上述输出的命令 `|bash`
    `mysql -uroot -p'mysqladmin' -e "show databases;" |grep -Evi "database|info|perfor" | sed -r 's#^([a-z].*$)#mysqldump -uroot -p'mysqladmin' --events -B 1|gzip > /opt/1.sql.gz#g'| bash`

    6. 分库备份2
    ```bash
    for dbname in `mysql -uroot -p'mysqladmin' -e "show databases;" |grep -Evi "database|info|perfor"`; do
    mysqldump -uroot -p'mysqladmin' --events -B $dbname | gzip > /opt/bak/${dbname}_bak.sql.gz
    done
    ```

    7. 多表备份
    `mysqldump -uroot -p'mysqladmin' db_name tb_test1 tb_test2 `

    > 备份多表不使用`-B` 参数,第一个为数据库名称,之后的为表名称

    8. 分表备份
    和分库备份类似,每执行一条语句备份一个表,生成不同的文件。

    > 分表备份缺点:文件较多

    - 完整备份
    - 分库备份
    - 分表备份
    - 批量恢复

    9. 备份表结构
    `mysqldump -uroot -p'mysqladmin' --compact -d db_test tb_test`

    10. 备份表数据
    `mysqldump -uroot -p'mysqladmin' --compact -t db_test tb_test`


    11. 刷新binlog参数
    ```
    mysqldump -uroot -p'mysqladmin' -A -B --events|gzip > /opt/a.sql.gz
    mysqldump -uroot -p'mysqlamdin' -A -B -F --events|gzip > /opt/a.sql.gz
    -F 切割binlog

    ```

    12. 记录binlog位置
    `mysqldump -uroot -p'mysqladmin' --master-data=1 --compact db_test`
    `--master-data=1`
    `--master-data=2` 将CHANGE语句加上注释

    --master-data 作用:
    --master-data=1: 从库
    `CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000020',MASTER_LOG_POS=1191;`


    **mysqldump 的关键参数说明**
    `mysqldump --help`
    -B 指定多个库,增加建库语句和 `USE` 语句
    --compact 去掉注释,调试使用
    -A 所有库
    -F 刷新binlog日志
    --master-data 增加binlog日志文件名及对应的位置点
    -x, --lock-all-tables 锁表
    -l, --lock-tables 只读锁表
    -d 只备份表结构
    -t 只备份数据
    --single-transaction 适合innodb事务数据库备份

    InnoDB 表在备份时,通常启用选项 --single-transaction 来保证备份的一致性,实际上它的工作原理是设定本次会话的隔离级别为:REPEATABLE READ,以确保本次会话(dump)时,不会看到其它会话已经提交了的数据。

    MyIsam备份命令:
    mysqldump -uroot -p'mysqladmin' -A -B --master-data=2 -x --events|gzip > /opt/all.sql.gz

    Innodb备份命令(推荐):
    mysqldump -uroot -p'mysqladmin' -A -B --master-data=2 --single-transaction --events|gzip > /opt/all.sql.gz


    ### 数据库恢复
    1. source 数据恢复
    `systel ls `执行系统命令
    `source *.sql` 文件默认为登录mysql前的系统路径

    2. 标准恢复命令
    ```mysql
    mysql -uroot -p'mysqladmin' -e "USE db_test; DROP tables; SHOW tables;"
    mysql -uroot -p'mysqladmin' db_test < /opt/mysql_bak.sql
    mysql -uroot -p'mysqladmin' -e "USE db_test;SHOW tables;"
    ```

    提取目录下的备份文件名
    ```bash
    ls| awk -F "." '{print $1}'
    sed 's#_bak.sql.gz##g'
    ```

    循环恢复
    ```bash
    for dbname in `sed 's#_bak.sql.gz##g'`; do
    gzip -d ${dbname}_bak.sql.gz;
    mysql -uroot -p'mysqladmin' $dbname < ${dbname}_bak.sql;
    done
    ```

  • 相关阅读:
    navicat安装与激活
    MySQL 安装
    oracle中not in 和 in 的替代写法
    oracle中in和exists的区别
    oracle中nvarchar2()和varchar2()的区别
    oracle稳定执行计划(更改)的方法
    oracle显示转化字段类型
    oracle中varchar2(2)存不了一个汉字的原因
    oracle中索引快速全扫描和索引全扫描的区别
    oracle常见的执行计划
  • 原文地址:https://www.cnblogs.com/yan-lei/p/13515388.html
Copyright © 2011-2022 走看看