MySQL数据库的备份与恢复

一、备份数据库

  • 1.1.mysqldump进行逻辑备份单个库

    mysql数据库自带了mysqldump备份命令,其语法为:
    mysqldump -u 用户名 -p 数据库名 >备份的文件名
    例如:备份名为data_default的库

    mysql -uroot -p123456 -e "use data_default;show tables;select * from student"#在linux命令行查看mysql库中的表内容
    mysqldump -uroot -p123456 data_default >/opt/mysql_bak.sql #备份到/opt/mysql_bak.sql
    mysqldump -uroot -p123456 --default-character=utf-8 data_default >/opt/mysql_bak.sql #指定字符集导出以免乱码。或者--default-character-set=utf8
    egrep -v "^$|--|#|\*" /opt/mysql_bak.sql  #查看备份
    
     DROP TABLE IF EXISTS `student`;
    CREATE TABLE `student` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `name` char(15) NOT NULL,
     `age` tinyint(2) NOT NULL DEFAULT '0',
    `dept` varchar(16) DEFAULT NULL,
    `sex` char(2) DEFAULT NULL,
    PRIMARY KEY (`id`),
    KEY `index_dept` (`dept`(8))
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT    CHARSET=utf8;#建表的语句
    LOCK TABLES `student` WRITE;#上锁
    INSERT INTO `student` VALUES (1,'lily',0,NULL,NULL); #插入语句
    UNLOCK TABLES;
    #mysql带-e参数实现非交互式对话
    例如:
     [root@localhost ~]# mysql -uroot -p123456 -e "select * from data_default.student"
    

    实际上用mysqldump备份,是把SQL语句备份下来(不记录查找的语句),然后删除原来的表重新操作。
    备份时加入-B,可以自动建库。

     mysqldump -uroot -p123456 -B data_default >/opt/mysql_bak_b.sql #备份到/opt/mysql_bak_b.sql。
    

    下面比较一下两个备份区别:

     diff /opt/mysql_bak.sql /opt/mysql_bak_b.sql 
    18a19,26
    -- Current Database: `data_default`
    --
    
    CREATE DATABASE /*!32312 IF NOT EXISTS*/ `data_default`   /*!40100 DEFAULT CHARACTER SET utf8 */;
    USE `data_default`; 
    --
     55c63
     -- Dump completed on 2019-06-27  5:22:30
     ---
    -- Dump completed on 2019-06-27  5:48:49
    

    发现多了一个create语句和use语句,加上-B参数的作用是增加创建数据库和链接数据库命令。恢复命令与不加B的不同:

    mysql -uroot -p123456 

    指定压缩命令来备份数据库:

    mysqldump -uroot -p123456 --default-character=utf-8 -B data_default|gzip>/opt/mysql_bak_b.sql.gz #gzip压缩命令来压缩

  • 1.2 备份多个库
    备份命令:

    mysqldump -uroot -p123456 --default-character=utf-8 -B data_default test|gzip>/opt/mysql_bak_b.mul.sql.gz  #备份data_default和 test两个库
    

    备份所有库:

    mysql -uroot -p123456 -e "show databases;" |egrep -vi "database|information_schema| performance_schema|test"|sed 's#^([a-z].*$)#mysqldump -uroot -p123456 -default-character=utf-8 --events -B \1 |gzip >/opt/\1.sql.gz#g' |bash
    或者
    
     for dbname in `mysql -uroot -p123456 -e "show databases;" |egrep -vi "database|information_schema| performance_schema|test"`
    do
    mysqldump -uroot -p123456 -default-character=utf-8 --events -B $dbname|gzip >/opt/bak/${dbname}_bak.sql.gz
    
  • 1.3 mysqldump备份表
    备份单个表:
    语法:mysqldump -u 用户名 -p 密码 数据库名 表名 >备份的文件名。
    例如:

     mysqldump -uroot -p123456 data_default  student >/opt/tables.sql
     #注意这里不能加-B参数,因为库后面就是表。
    

    备份多个表:
    语法:mysqldump -u 用户名 -p 密码 数据库名 表名1 表名2 >备份的文件名
    例如:

    mysqldump -uroot -p123456 data_default test  student >/opt/tables.sql
    

    总结:如果一个库里既有大表又有小表,如果只恢复某一小表,则最好每个表备份成一个数据文件。例如

    mysqldump -uroot -p123456 data_default test  >/opt/test.sql
    mysqldump -uroot -p123456 data_default test1  >/opt/test1.sql
    
  • 1.4 利用mysqldump -d只备份表结构
    例如:备份data_default库所有表结构

    mysqldump -uroot -p123456  -B -d data_default >/opt/data.sql
    

    备份表结构:

    mysqldump -uroot -p123456   -d data_default  test >/opt/test.sql
    
  • 1.5 利用mysqldump -t只备份表数据

    mysqldump -uroot -p123456   -t data_default  test >/opt/test.sql
    
  • 1.6利用mysqldump -A备份数据库所有数据
    例如:

    mysqldump  -uroot -p123456  -A -B --events|gzip >/opt/mysql.sql.gz
    
  • 1.7利用mysqldump -F(-flush-logs)备份数据库自动切割bin-log,产生一个新的mysql-bin.00000X 文件,记录备份后对数据库所有的DDL和DML语句。

    mysqldump  -uroot -p123456  -A -B  -F --events|gzip >/opt/mysql.sql.gz
    
  • 1.8利用mysqldump --master-data=1备份数据库
    –master-data=1 在备份语句里添加CHANGE MASTER语句以及binlog文件及位置点信息,这样就不需要切割bin-log,可以直接找到备份位置。

     mysqldump  -uroot -p123456  --master-data=1 --compact  data_default >/opt/data1.sql
        CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000005', MASTER_LOG_POS=1373;  #告诉位置,当前备份的是pos为1373以前的,包括1373.
       /*!40101 SET @saved_cs_client     = @@character_set_client */;
    /*!40101 SET character_set_client = utf8 */;
      CREATE TABLE `student` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
     `name` char(15) NOT NULL,
    `age` tinyint(2) NOT NULL DEFAULT '0',
    `dept` varchar(16) DEFAULT NULL,
    `sex` char(2) DEFAULT NULL,
    PRIMARY KEY (`id`),
    KEY `index_dept` (`dept`(8))
     ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
     /*!40101 SET character_set_client = @saved_cs_client */;
     INSERT INTO `student` VALUES (1,'shitan',0,NULL,NULL);
    

    mysqldump参数总结:
    1.-B指定多个库,增加建库语句和use
    2.–compact 去掉注释
    3.-A备份所有库
    4.-F刷新binlog日志
    5.–master-data增加binlog日志文件名以 及对应位置
    6.-x,锁表(–lock-all-tables)
    7.-l,缩表为只读(–lock-tables)
    8.-d,只备份表结构
    9.-t只备份数据
    10.–single-transaction 适合innodb事务数据库备份。innodb表在备份时,通常启用–single-transaction来保证备份的一致性,实际上它的工作原理是设定本次回话的隔离级别为:REPEATABLE READ,以确保本次dump时,不会看到其他会话已经提交的数据。
    不同引擎备份命令:
    myisam:

     mysqldump  -uroot  -p123456 -A -B --master-data=2 -x --events|gzip>/opt/all.sql.gz  #myisam直接锁表,备份时不能读写
    

    innodb:

    mysqldump -uroot -p123456 -A -B --master-data=2 --single-transaction --events|gzip>/opt/all.sql.gz
    

–master-data=2 是把change log 那行注释掉,=1 是没有注释.

二、恢复数据库

  • 2.1利用备份恢复数据库

    恢复命令:
    mysql -uroot -p123456 data_default mysql -uroot -p123456

  • 2.2.备份结合bin_log日志恢复数据库

    详细解释请看Mysql数据库之Binlog日志使用总结这篇文章。
    binlog日志存放在mysql安装目录下的/data目录下,用来记录mysql内部所有的增删改查等对mysql数据库内容有更新的操作纪律。
    binlog日志包括两类文件
    1)二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制文件
    2)二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句select)语句事件。
    开启binlog日志功能
    binglog日志什么状态下刷新(切割)
    1)每当mysqld服务重启时
    2)执行mysql> flush logs;命令时
    3)在mysqldump备份数据时加 -F 选项也会刷新binlog日志;

    vim /etc/my.cnf
    在[mysqld] 区块添加 
    log-bin=mysql-bin 确认是关闭状态(mysql-bin 是日志的基本名或前缀名)
     /etc/init.d/mysqld restart #重启mysqld生效
     查看binlog日志方法两种:
    

    1) 通过mysqlbinlog命令可以查看binlog的内容

    # /home/application/mysql/bin/mysqlbinlog /home/application/mysql/data/mysql-bin.000001|more
     
     /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
    /*!40019 SET @@session.max_insert_delayed_threads=0*/;
    /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
    DELIMITER /*!*/;
    # at 4
    #190628  1:19:57 server id 1  end_log_pos 107   Start: binlog v 4, server v 5.5.62-log created 190628  1:19:57 at startup
    # Warning: this binlog is either in use or was not closed properly.
    ROLLBACK/*!*/;
    BINLOG '
    vfoUXQ8BAAAAZwAAAGsAAAABAAQANS41LjYyLWxvZwAAAAAAAAAA     AAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAC9+hRdEzgNAAgAEgAEBAQEEgAAVAAEGggAAAAICAgCAA==
    '/*!*/;
    DELIMITER ;
    # End of log file
     ROLLBACK /* added by mysqlbinlog */;
     /*!50003 SET   COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
     /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
    

    解析binlog格式:
    位置
    位于文件中的位置,“at 4”说明“事件”的起点,是以第4字节开始;“end_log_pos 107”说明以第294字节结束

    时间戳
    事件发生的时间戳:“190628 1:19:57”

    事件执行时间
    事件执行花费的时间:“exec_time=28”

    错误码
    错误码为:“error_code=0”

    服务器的标识
    服务器的标识id:“server id 1”
    2)在进入mysql数据库查看
    命令格式:
    mysql> show binlog events [IN ‘log_name’] [FROM pos] [LIMIT [offset,] row_count];
    参数解释:
    IN ‘log_name’ :指定要查询的binlog文件名(不指定就是第一个binlog文件)
    FROM pos :指定从哪个pos起始点开始查起(不指定就是从整个文件首个pos点开始算)
    LIMIT [offset,] :偏移量(不指定就是0)
    row_count :查询总条数(不指定就是所有行)

    查看binlog日志列表

     show master logs;
    +------------------+-----------+
    | Log_name         | File_size |
    +------------------+-----------+
    | mysql-bin.000001 |       107 |
    +------------------+-----------+
     1 row in set (0.00 sec)
    

    例如:

     mysql> show binlog events in 'mysql-bin.000001'\G; #加上G以表显示
     *************************** 1. row ***************************
     Log_name: mysql-bin.000001
     Pos: 4
    Event_type: Format_desc
    Server_id: 1
    End_log_pos: 107
    Info: Server ver: 5.5.62-log, Binlog ver: 4
    1 row in set (0.00 sec)
    
    ERROR: 
    No query specified
    
    mysql> show binlog events in 'mysql-bin.000001'; #推荐
    +------------------+-----+-------------+-----------+-------------+----------------  -----------------------+
    | Log_name         | Pos | Event_type  | Server_id | End_log_pos | Info                                  |
    +------------------+-----+-------------+-----------+-------------+---------------------------------------+
    | mysql-bin.000001 |   4 | Format_desc |         1 |         107 | Server ver: 5.5.62-log, Binlog ver: 4 |
    +------------------+-----+-------------+-----------+-------------+---------------------------------------+
    1 row in set (0.00 sec)
    

    其他一些用法:
    a)查询第一个(最早)的binlog日志:
    mysql> show binlog events\G;

    b)指定查询 mysql-bin.000002这个文件:
    mysql> show binlog events in ‘mysql-bin.000002’\G;

    c)指定查询 mysql-bin.000002这个文件,从pos点:624开始查起:
    mysql> show binlog events in ‘mysql-bin.000002’ from 624\G;

    d)指定查询 mysql-bin.000002这个文件,从pos点:624开始查起,查询10条(即10条语句)
    mysql> show binlog events in ‘mysql-bin.000002’ from 624 limit 10\G;

    e)指定查询 mysql-bin.000002这个文件,从pos点:624开始查起,偏移2行(即中间跳过2个),查询10条
    mysql> show binlog events in ‘mysql-bin.000002’ from 624 limit 2,10\G;
    恢复:
    a)从binlog日志恢复数据方法
    恢复命令的语法格式:
    mysqlbinlog mysql-bin.0000xx | mysql -u用户名 -p密码 数据库名

    常用参数选项解释:
    –start-position=875 起始pos点
    –stop-position=954 结束pos点
    –start-datetime=“2018-9-25 22:01:08” 起始时间点
    –stop-datetime=“2018-9-25 22:09:46” 结束时间点
    –database=zyyshop 指定只恢复zyyshop数据库(一台主机上往往有多个数据库,只限本地log日志)

    不常用选项:
    -u --user=name 连接到远程主机的用户名
    -p --password[=name] 连接到远程主机的密码
    -h --host=name 从远程主机上获取binlog日志
    –read-from-remote-server 从某个MySQL服务器上读取binlog日志

    小结:实际是将读出的binlog日志内容,通过管道符传递给mysql命令。这些命令、文件尽量写成绝对路径;
    首先恢复没问题数据
    mysql -uroot -p123456 data_default 找到出问题语句,删除出问题语句然后恢复

    mysqlbinlog --stop-position=108 --database=data_default     /var/lib/mysql/mysql-bin.000001 | mysql -uroot -p123456 -v data_default
    #指定恢复108以前的数据,并且指定data_default库
    

    b)指定库恢复数据
    因为binlog日志是记录所有对数据操作的语句,不分库记录。所有的操作都记录在一起。例如只想恢复某一个库的数据可以加-d( --database=)参数;

     mysqlbinlog -d data_default mysql-bin.000005 |mysql -uroo -p123456 
    
  • 2.3 利用source命令恢复数据库

    进入mysql数据库控制台,mysql -u root -p登录后。
    mysql>use 数据库
    然后使用source命令,参数为备份的文件*.sql.
    mysql>source data_db.sql#这个文件是系统路径,默认是登录mysql前的系统路径。
    例如:

    mysql>system ls /opt  #查看备份路径
    mysql>source /opt/data_db.sql
    

三、查看mysql状态

show status:查看当前回话的数据库状态信息
show global status;查看整个数据库运行状态信息
show processlist;查看正在执行的sql语句,看不全
show full processlist;查看正在执行的完整sql语句,全
set global key_buffer_size =32552441;不重启数据库调整缓存大小,直接生效,重启失效
show variables;查看数据库的参数信息,例如:my.cnf里的参数。

你可能感兴趣的:(数据库,mysql数据库的备份与恢复)