您的位置:首页 > 数据库 > MySQL

mysql的日志及利用mysqldump备份及还原

2016-01-14 13:49 591 查看
日志文件:6类

      一般查询日志:log,general_log,log_output

      慢查询日志:

      错误日志

      二进制日志

      中继日志

      事务日志

 二进制日志:

     记录了当前服务器的数据修改和有潜在可能性影响数据修改的语句

     默认在数据目录下,通常情况下为mysql-bin

     可以通过mysqlbinlog来查看

     时间记录 time

     偏移位置 position

     show master status 查看当前使用的二进制日志和下一个事件开始时的基于的位置

     日志滚动:当超过1G,日志会滚动

        可以按照大小定义

                时间定义

                执行flush logs

     查看当前正在使用的log日志

     show binary logs

mysql> show binary logs;

+------------------+-----------+

| Log_name         | File_size |

+------------------+-----------+

| mysql-bin.000001 |       996 |

| mysql-bin.000002 |       126 |

| mysql-bin.000003 |     39892 |

| mysql-bin.000004 |       201 |

| mysql-bin.000005 |       194 |

+------------------+-----------+

二进制日志的功用

     即时点恢复:

     复制:

清除日志

PURGE { BINARY | MASTER } LOGS

    { TO 'log_name' | BEFORE datetime_expr(某个时间之前) }

查看mysql的日志

SHOW BINLOG EVENTS

mysql> show binlog events\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.33-log, Binlog ver: 4

service-id:服务器身份标识

INSERT INTO t1 value(current_date())

Mysql 记录二进制日志的格式

   基于语句:statement

   基于行:row

   混合模式:mixed

指定从那个位置开始读取

mysql> show binlog events in 'mysql-bin.000001' from 371\G

或者

# mysqlbinlog --start-position=371 mysql-bin.000005

mysqlbinlog

   --start-time

   --stop-time

   --start-position

   --stop-position

    二进制日志文件内容格式

      事件发生的日期和时间

      服务器ID

      事件结束位置

      事件的类型

      原服务器生成此事件时的线程ID号

      语句时间戳和写入二进制文件的时间差,单位为秒

      错误代码,0表示正常执行

      事件内容

      事件位置(相当于下一事件的开始位置)

服务器参数:

      log_bin = {ON|OFF},还可以是一个文件路径                          

      log_bin_trust_function_creators  不阻止任何存储函数

      sql_log_bin = {ON|OFF} 当前会话是否将二进制文件进入进二进制文件

      sql_log_off 是否将一般查询日志记入查询日志

      sync_binlog 同步缓冲中的二进制到硬盘的时间,0不基于时间同步,只在事件提交时同步

      binlog_format = {|statement|row|mixed}

      max_binlog_cache_size = mysql二进制日志的缓冲区大小,仅用于缓存事务类的语句

      max_binlog_stmt_cache_size 语句缓冲区大小,即事务类和非事务类公用的大小

      max_binlog_size 二进制日志文件的上限,单位为字节

  建议:切勿将二进制日志与数据文件放在同一设备

  设置二进制日志文件目录:

  # mkdir /data/binlog

  # chown mysql.mysql /data/binlog

  vim /etc/my.cnf

  加入 log-bin=/data/binlog/mysql-bin



重启mysql服务生效

  # service mysqld restart

  可以临时通过sql_log_bin来控制二进制的写入

中继日志:

  对于非从服务器 中继日志没有启用

  relay_log_purge = {ON|OFF} 是否自动清理不在需要的中继日志

  relay_log_space_limit 中继大小是否限制

备份和恢复:

    1.做灾难恢复

    2.做审计

    3.测试

  备份:目的用于恢复;对备份数据做恢复测试

  备份类型:

      根据备份时,数据库服务器是否在线

        冷备:cold  backup

        温备:warm backup 全局施加共享锁,只能读,不能写

        热备:hot backup 

      根据备份的数据集:

         完全备份 full backup

         部分备份 partial backup

      根据备份时的接口(直接备份数据文件还是通过mysql服务器导出数据)

          物理备份:直接复制(归档)数据文件的备份方式

          逻辑备份:把数据从库中提取出来保存为文本文件

      根据备份时是备份整个数据还是仅备份变化的数据

          完全备份:full backup

          增量备份:incremental backup

          差异备份:differential backup 从上一个完全备份开始备份

备份策略:

   选择备份方式

   选择备份时间

   考虑到恢复成本

       恢复时长

   考虑备份成本

       锁时间

       备份时长

       备份负载

备份对象:

    数据

    配置文件:

    代码:存储过程、存储函数、触发器

    OS相关的配置文件,如crontab配置计划及相关脚本

    跟复制相关的配置信息:

    二进制日志文件

常用的备份工具

  mysqldump(单线程):逻辑备份工具

     InnoDB热备、MyISAM温备、Aria温备

     备份和恢复过程较慢

  mysqldumper:多线程的mysqldump

     很难实现差异或增量备份

  基于lvm-snapshot

         接近于热备的工具,因为要先请求全局锁,而后创建快照,并在创建完成后释放全局锁

         使用cp、tar等工具进行物理备份

         备份和恢复速度较快

         很难实现增量备份,并且请求全局锁需要等待一段时间,在繁忙的服务器上尤其如此

  SELECT clause INTO OUTFILE ‘/path/to/somefile’

  LOAD DATA INFILE ‘/path/from/somefile’

      部分备份工具,不会备份关系定义,仅备份表中的数据

      是个逻辑备份工具,快于mysqldump

   Innobase:商业备份工具,innobackup 

   Xtarbackup:有Percona提供的开源备份工具

      InnoDB热备,增量备份

      MyISAM热备,不支持增量

      物理备份,速度快

   mysqlhotcopy:几乎冷备

mysqldump:仅适用于数据集较小

    使用格式:mysqldump [options] [db_name [tbl_name ...]]

         还原时库应该存在

         -u uername

         -h 主机名

         -p 密码

    恢复时应该使用mysql < /path/to/file.mysql

   备份单个库 mysqldump [options] db_name > /path/to/file.mysql

      恢复时如果目标不存在,应先创建数据库,如果不想创建,这使用--databases

    

    # mysqldump -uroot -hlocalhost -p hellodb > /tmp/hello.sql

   备份所有的库

        mysqldump --all-databases > /path/to/file.mysql

# mysqldump --all-databases > /tmp/alldb.sql

    备份指定的多个库

       --databases tb1 tb2 .....

       # mysqldump --databases hellodb mydb > /tmp/hellandmydb.sql

       恢复:

       # mysql < /tmp/hellandmydb.sql

    注意:备份前要加锁

    --lock-all-tables :请求锁定所有表之后在备份,对MyISAM,InnoDB,Aria做温备

    --single-transaction:能够对InnoDB存储引擎实现热备

    备份代码
    --events:备份事件调度器代码
    --routines:备份存储过程和存储函数
    --triggers:备份触发器

    备份时滚动日志:

         --flush-logs:备份前、请求到锁之后滚动日志

    复制时的同步位置标记

         --master-data={0|1|2}

         0表示不记录,

         1表示记录为change master语句

         2表示记录为注释的change master语句

    使用mysqldump备份

        请求锁:--lock-all-tables 或使用--single-transaction进行innodb热备

        滚动日志:--flush-logs

        选定要备份的库 --databases

  记录二进制文件及位置 --master-date                                                                                                

    手动请求全局锁

        

        FLUSH [NO_WRITE_TO_BINLOG | LOCAL]  flush_option [, flush_option] ...

        flush tables with read lock

        flush logs

        

        unlock tables

    恢复:

       建议:关闭二进制日志,关闭其他用户的写操作

       应该用souce 恢复

    备份策略:基于mysqldump

    备份:mysqldump+二进制日志文件

         周日做一次完全备份,备份的同时滚动日志

         周一至周六:备份二进制日志

         

         myadmin flush-logs

    恢复:完全备份+各二进制文件至此刻的事件 

    对于MYsql配置文件,以及与mysql相关的OS配置文件在每次修改后都应该直接进行备份

案例:   对hellodb数据库进行还原操作



    1.查看hellodb数据库表使用的引擎情况,有myisam数据库

    mysql> show table status from hellodb\G

    备份hellodb数据库,--master-data-2标记日志文件的位置

    # mysqldump --databases hellodb --lock-all-tables --flush-logs --master-data=2 > /tmp/hello.a.sql

  

    通过命令可以看到此时的位置107,

    mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 |      107 |              |                  |
+------------------+----------+--------------+------------------+

    或者vim /tmp/hellodb.20160114.sql,也可以看到二进制文件标记



    2.模拟失误操作

    创建newtb表,并插入数据

    mysql> create table newtb(name char(30));

    mysql> insert into newtb(name) values('tom'),('lily'),('lucy');



    清空表数据

    mysql> truncate table newtb;

    查看二进制从107位置开始的日志记录

    # mysqlbinlog --start-position=107 /data/binlog/mysql-bin.000004



   将日志中记录这一部分记录截取出来生成增量的sql

   # mysqlbinlog --start-position=107 --stop-position=712 mysql-bin.000005 > /tmp/hello.a.inc.sql

    3.还原

    关闭还原操作的日志记录

    mysql> set session sql_log_bin=0;

    还原完整备份

    mysql> source /tmp/hellodb.a.sql

    验证数据库是否存在

    

    还原增量备份

    mysql> source /tmp/hello.a.inc.sql
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql