mysql日志、数据备份与恢复

### Mysql体系结构

  • MySQL属于Client/Server结构,Server端程序为mysqld,该服务启动后,Client端程序从本地或者远程连接Server

  • 常见的Client程序,例如:mysql、mysqldump、mysqlshow、mysqlbinlog等,也包括通过MySQL API和连接器连接到MySQLD的各类编程语言程序

  • mysqld程序为服务器进程可以划分为三层

    • 连接层:处理连接
    • SQL 层:处理所连接的应用程序发送的 SQL 查询
    • 存储层:处理数据存储,MySQL数据可以按不同格式和结构存储在不同物理介质上,也称为存储引擎
      image-20191204151131621
  • mysql连接层

    • 通过多种通信方式接受来自客户机的连接请求
    • 包括如下协议
      方式 连接类型 支持的操作系统
      TCP/IP 本地、远程 所有
      UNIX套接字文件 仅本地 UNIX
      共享内存 仅本地 Windows
      命名管道 仅本地 Windows
  • sql层

    • 建立连接后,MySQL 服务器将处理以下任务:
      • 授权和解析器:解析器验证语法是否正确,然后,授权验证是否允许所连接的用户运行特定查询 (已验证通过的用户是否具有访问数据库对象的权限)
      • 优化器:创建每个查询的执行计划,这是有关如何以最优化的方式执行查询的分步指令集;确定要使用哪些索引以及采用何种顺序处理表是此步骤的最重要部分
      • 查询:完成每个查询的执行计划
      • 查询高速缓存:(可选配置)可配置的查询高速缓存,可用于存储(并立即返回)执行查询的结果集
      • 查询日志记录:可以启用以跟踪执行的查询

    image-20191204151742104

  • 存储层

    • MySQLD可以支持不同类型的“存储引擎”来存储数据
    • InnoDB 是默认存储引擎,支持事务、全文索引和外键约束,因此适用于各种混合查询
    • 其他存储引擎包括:
      • MyISAM:适用于频繁读取但很少更新的数据
      • MEMORY:在内存中存储所有数据
      • NDB (MySQL Cluster版支持):供 MySQL Cluster 用来为高可用性数据提供冗余的可伸缩拓扑
      • ARCHIVE:适用于不更新偶尔查询的历史数据,提供压缩功能节约磁盘存储空间
  • 常用存储引擎特点:

    • INNODB引擎:
      • 默认存储引擎
      • 支持事务
      • 支持行级锁
      • 支持外键
      • 适用于具有数据一致性要求和并发读写要求的通用性业务
    • MyISAM引擎:
      • MySQL早期版本默认存储引擎
      • 读取(select)速度快
      • 不支持事务和外键
      • 适用于修改较少读取频繁且对数据一致性要求不高的业务
    • Archive引擎:
      • 数据压缩比非常高可以节约大量磁盘空间
      • 不支持索引、事务和外键
      • 支持insert、select不支持update和delete
      • 适用于数据量大偶尔需要查询的历史归档业务数据

MySQL配置选项

  • MySQL提供几百个选项(参数)对数据库各个功能进行配置,并给定默认值,使数据库运行

  • 查看所有选项
    image-20191204152528404

    image-20191204152647565

    show variables;
    #数据库命令行查看
    mysqld --verbose --help
    #系统命令查看
    
  • 查看指定的选项
    image-20191204152938842

    image-20191204153228965

  • 更改选项的值
    image-20191204154014965
    或通过修改配置文件进行永久修改
    image-20191204160012020
    image-20191204155951708

  • 选项优先级

    1. 命令行选项
    2. 配置文件
    3. 默认值
  • 查看用户设置的选项
    image-20191204160206013

Mysql日志配置

  • 常见日志分类

    • 错误日志 (error log)
      • 记录mysqld启动、运行和停止过程中遇到的问题
    • 常规日志 (general query log)
      • 记录客户端连接以及服务器从客户端收到的各类SQL语句
    • 慢查询日志 (slow query log)
      • 记录运行时间超过选项long_query_time设定阈值的查询语句
    • 二进制日志 (binary log)
      • 记录使数据库数据产生变化的各类语句
  • 日志文件的特点

    • 有可能会占用大量磁盘空间
    • 通常存储在文件中
    • 可以选择存储在mysql的表中,便于查询和分析
    • 仅限于常规查询和慢查询日志
    • 除了二进制日志,通常以文本格式记录数据
  • mysql的错误日志

    • 默认开启
    • 查看错误日志存放位置
      image-20191204161217681
    • 修改配置
      image-20191204161349936
      image-20191204161330190
  • mysql常规日志

    • 默认关闭
    • 查看常规日志状态及存放位置
      image-20191204161517594
    • 启用常规日志
      image-20191204161617120

      image-20191204162402884
      image-20191204162501879
    • 测试
      image-20191204161807560
      image-20191204161743510
  • mysql慢查询日志

    • 默认关闭

    • 查看慢查询日志状态及存放位置
      image-20191204162001886

    • 查看慢查询时长
      image-20191204162056221
      注:默认为10,(单位:秒),超过该时长的查询会被慢查询日志记录

    • 启用慢查询日志
      image-20191204162327310

      image-20191204162407065
      image-20191204162559306

    • 测试
      image-20191204162807404
      image-20191204162839413

      select benchmark(1000000000,10*10);
      #benchmark(1000000000,10*10) 将10*10执行1000000000次
      
  • mysql二进制日志Binlog

    • 默认关闭

    • 开启binlog后,所有导致数据库数据产生变化的操作会按照时间顺序以“事件”的形式记录到binlog二进制文件中

    • 主要用途

      • 数据库复制
      • 数据恢复
    • 查看binlog状态
      image-20191204163513582

    • 开启binlog并指定存放路径
      image-20191204164206904
      image-20191204164738217
      image-20191204164236636
      image-20191204164818854

      log_bin=/var/lib/mysql/mysql-bin #开启binlog并指定存放路径
      server-id=1 #为binlog设置服务id号
      #可以使用expire_logs_days参数指定定期清理的时间间隔(单位:天)
      
    • 日志文件滚动(切换)

      • MySQL启动或重启
      • 日志量到达了max_binlog_size的设定值
      • 执行flush logs;命令手动切换日志
      • 测试
        image-20191204165305515
        image-20191204165316972
        image-20191204165340234
    • binlog记录内容

      • binlog以紧凑的二进制方式存储

      • 日志中包含数据和表结构更改事件及其时间戳

      • 无法使用普通的文本查看软件查看其内容,mysql提供了mysqlbinlog工具将二进制数据转换为sql文件

      • 查看
        image-20191204165616416

      • 将binlog转换为sql文件
        image-20191204170734926

        image-20191204171112160

        注:在binlog中保存每条记录的头注释

      • 常用相关命令

        image-20191204171259882

        image-20191204171400837

        image-20191204190851681

        image-20191204191029803

        image-20191204191124055

        image-20191204190103054

        root@localhost[(none)]>show binary logs; #查看所有日志文件
        root@localhost[(none)]>show master status; #查看当前记录日志文件详情
        root@localhost[(none)]>root@localhost[(none)]>show binlog events; #查看第一个binlog日志文件中的事件
        root@localhost[(none)]>show binlog events in 'mysql-bin.000002'; #查看指定binlog中的事件
        show binlog events in 'mysql-bin.000002' from 123; #查看指定binlog中指定起始头注释的事件
        [root@tomcat mysql]# mysqlbinlog --start-position=4 --stop-position=123 /var/lib/mysql/mysql-bin.000002
        #查看指定的起始头注释
        

数据库的备份与恢复

  • 常见术语:

    • 物理备份

      • 生成数据库文件的完整副本(二进制),可以使用标准命令,如 cp、tar、xcopy、windows图形复制粘贴
  • 要注意保持数据的一致性,对于默认引擎为innodb的数据库需要停止MySQL服务后再进行物理备份(冷备)

    • 逻辑备份

      • 将数据库和表转换为一个sql文本文件,里面包括可以重构数据库和表的SQL语句
  • 可以使用该文本文件在运行不同体系结构的其他主机上重新装入数据库

      - 要求 MySQL 服务器在备份期间运行 (不能冷备)
    
  • 基于数据库复制的备份

    • 创建一个主库的复制库从库,主库作为生产库,从库作为备份库

    • 主库定期向从库传递binlog文件,并在从库应用保证从库和主库的一致性

    • 从库也可以做物理备份或逻辑备份

    • 完全备份

      • 备份所有数据库文件:/var/lib/mysql/*
    • 备份所有binlog文件: /var/lib/mysql/mysql-bin.*

      • 备份选项文件: /etc/my.cnf
  • 不完全备份

      - 仅仅备份部分数据库的文件
    
  • 热备
    - 数据库不关闭,在仍然有用户读取或修改数据的过程中进行备份,热备不阻止用户正常的数据库操作,有些热备工具甚至能捕获备份进行期间发生的更改
    - 并非所有引擎都支持热备,innodb引擎可以支持热备,但MyISAM引擎不能热备

    • 温备
    • 数据库不关闭,处于只读模式,备份可以在用户读取数据时进行
      • 温备优点是不必完全锁定数据库访问用户,其不足之处在于用户无法在进行备份时修改数据库的数据
  • 冷备

    • 关闭数据库,备份在用户不能访问数据时进行,因此用户无法读取或修改数据
      • 冷备会阻止执行任何使用数据的活动,如果备份时间较长,会造成用户较长的时间里无法访问数据
  • 物理备份

    • 冷备

      • 关闭数据库服务

        image-20191204193631985

      • 使用cp命令备份整个数据库到指定目录下

        image-20191204193751654

    • 温备

      • 为数据库加表只读锁

        image-20191204193938287

      • 复制数据库内容至备份目录(同上)

      • 复制完成解锁

        image-20191204194106212

    • 还原

      • 清理已损坏的数据库文件

        image-20191204194402308

      • 还原

        image-20191204194418184

  • 使用mysqldump进行逻辑备份

    • 属于mysql提供的逻辑备份工具

    • 将数据库的内容转储到文本文件

    • 可以指定所有数据库、特定数据库或特定表

    • 可以备份本地或远程数据库

    • 和存储引擎无关

    • 适合数据量较小的数据库数据导出

    • 不能关闭数据库,因此备份策略和时机可以灵活

    • 语法:mysqldump -uUSERNAME -p --opt DB > FILENAME.sql

      • --master-data=2 #备份过程锁住所有表,禁止执行select之外的所有语句
      • --single-transaction #开启事务备份,确保数据库的一致性(热备)
      • --lock-all-tables #对表加锁确保一致性(温备)
      • --flush-logs #先对binlog进行切换再进行备份
      • --add-drop-database #还原时先删除已有的数据库再创建新库
      • --add-drop-table #还原时先删除已有的表在创建新表
      • --routines #连通存储过程和函数一起备份
      • --triggers #连通触发器一起备份
      • --add-locks #还原时为insert语句添加独占锁
      • --create-options #备份文件中添加create语句
      • --quick #不把备份过程中的SQL语句放到查询缓冲区中,输出到标准输出
      • --extended-insert #使用多行插入语法,例如:insert into t values(1),(2),(3)...
      • --lock-tables #给备份过程中遇到的每个表加只读锁,备份时其他修改表的用户要等待该表备份完成
      • --set-charset #添加set names default_character_set到输出文件
      • --disable-keys #添加disable keys和enable keys到备份输出文件,还原插入记录时,插入完成后再建立索引提高还原效率
      • --opt #相当于--add-drop-table 、--add-locks、--create-options 、--quick、 --extended-insert、--lock-tables 、--set-charset 、--disable-keys的组合
    • 常用备份选项

      image-20191204202326495

      mysqldump -uroot -p --all-databases --single-transaction --master-data=2 --routines --triggers --events --flush-logs > /backup/all-db.sql
      #备份所有数据库
      

      image-20191204202626836

      mysqldump -uroot -p --databases demo test1 >/backup/dbs.sql
      #备份一个或多个数据库
      

      image-20191204202805955

      mysqldump -uroot -p  demo stu class bmi >/backup/db_demo_tables.sql
      #备份一个数据库中的一个或多个表
      
    • 还原

      image-20191204210346699

      image-20191204210500289

      image-20191204210516409

      image-20191204210712242

      [root@tomcat ~]# mysql -uroot -p demo < /backup/db_demo_tables.sql 
      #恢复demo数据库
      root@localhost[demo]>source /backup/db_demo_tables.sql;
      #数据库中使用source命令恢复数据
      
    • 数据库恢复分类

      • 完全恢复:从还原时的状态恢复到最后一个日志的最后一条语句
      • 不完全恢复:从还原时的状态恢复到指定日志的某个位置

实验1--冷备不完全恢复

  • 冷备数据库所有数据

    image-20191204220120025

  • 重启虚拟机mysql服务然后连接

    image-20191204220242424

  • 查看备份启动后binlog的编号

    image-20191205152145950

  • 生成测试数据并切换binlog日志

    image-20191205152535805

    image-20191205152647527

  • 插入新的数据,并删除数据库模拟误操作

    image-20191205152748185

  • 查看binlog找到误删操作的头注释号

    image-20191205152815024

    image-20191205152910298

  • 使用binlog日志生成恢复数据的sql语句

    image-20191205153259244

  • 通过另一台mysql服务器恢复数据

    • 将完全备份数据和生成的sql语句上传至另一台mysql服务器(这里使用的windows进行恢复操作)

      image-20191205153620721

    • 关闭mysql服务并导入冷备到data目录

      image-20191205153856730

      image-20191205154406232

      注:删除data目录原有旧文件

    • 启动mysql服务并执行sql文件恢复数据(登录时使用备份的数据库账号密码)

      image-20191205155502827

      image-20191205154649858

      image-20191205154720386

    • cmd中使用命令导出被误删除的数据库至sql文件中(不要使用powershell)

      image-20191205161731308

    • 将生成的test1.sql文件上传至被删库的mysql数据库

      image-20191205161359962

    • 执行sql文件恢复数据

      image-20191205161954534

      image-20191205162017244

posted @ 2019-12-05 22:13  MirL  阅读(817)  评论(0编辑  收藏  举报