Linux九阴真经之九阴白骨爪残卷12(备份还原)

一、备份策略

1、备份的类型

  • 类型1:
  • 热备份:读写不受影响(MyISAM不支持热备,InnoDB支持热备)
  • 温备份:仅可以执行读操作
  • 冷备份:离线备份,读写操作均中止
  • 类型2:
  • 物理备份:复制数据文件进行备份,占用较多的空间,速度快
  • 逻辑备份:将数据导出至文本文件中,占用空间少,速度慢,可能丢失精度
  • 类型3:
  • 完全备份:备份全部数据
  • 增量备份:仅备份上次完全备份或增量备份以后变化的数据,备份较快,还原复杂
  • 差异备份:仅备份上次完全备份以来变化的数据,备份较慢,还原简单

2、备份需要考虑的因素

  • 温备的持锁多久,在锁状态的情况下无法写入数据
  • 备份产生的负载,要调空闲的时间备份
  • 备份过程的时长,数据量大的时候时间会很长,要选择合适的方案
  • 恢复过程的时长,备份数据需要即时测试

3、备份的目标

  • 数据库数据,每个表空间单独存放
  • 二进制日志,需要和数据分开存储
  • InnoDB的事务日志
  • 存储过程、存储函数、触发器或事件调度器等
  • 服务器的配置文件:/etc/my.cnf

4、备份工具

  • mysqldump工具:逻辑备份工具,适用所有存储引擎温备;支持完全或部分备份;对InnoDB存储引擎支持热备;Schema(数据库的定义)和数据存储在一起。
用法:
           shell> mysqldump [options] db_name [tbl_name ...]
           shell> mysqldump [options] --databases db_name ...
           shell> mysqldump [options] --all-databases
选项:
    -A:备份所有库
    -B db_name1,[db_name2,...]:备份指定库
    -E:备份相关的所有event scheduler
    -R:备份所有存储过程和存储函数
    --triggers:备份表相关触发器,默认启用,用--skip-triggers,不备份触发器
    --master-data={1|2}:
         1:所备份的数据之前加一条记录为CHANGE MASTER TO语句,非注释,不指定默认为1
         2:记录为注释的CHANGE MASTER TO语句,注意:此选项会自动关闭--lock-tables功能,自动打开--lock-all-tables功能(除非开启--single-transaction)
    -F:备份前滚动日志,锁定表完成后,执行flush logs命令,生成新的二进制日志文件,配合-A时,会导致刷新多次数据库,在同一时刻执行转储和日志刷新,则应同时使用--flush-logs和-x,--master-data或-single-transaction,此时只刷新一次;建议:和-x,--master-data或 --single-transaction一起使用
    --compact 去掉注释,适合调试,生产不使用
    -d:只备份表结构
    -t:只备份数据,不备份create table
    -n:不备份create database,可被-A或-B覆盖
    --flush-privileges:备份前刷新授权表,备份mysql库或相关时需要使用
    -f:忽略SQL错误,继续执行
    --hex-blob:使用十六进制符号转储二进制列(例如,“abc”变为0x616263),受影响的数据类型包括BINARY, VARBINARY,BLOB,BIT
    -q:不缓存查询,直接输出,加快备份速度
MyISAM备份选项:支持温备;不支持热备,所以必须先锁定要备份的库,而后启动备份操作-x,--lock-all-tables:加全局读锁,锁定所有库的所有表,同时加--single-transaction或--lock-tables选项会关闭此选项功能,注意:数据量大时,可能会导致长时间无法并发访问数据库-l,--lock-tables:对于需要备份的每个数据库,在启动备份之前分别锁定其所有表,默认为on,--skip-lock-tables选项可禁用,对备份MyISAM的多个库,可能会造成数据不一致

InnoDB备份选项:支持热备,可用温备但不建议用
--single-transaction:此选项Innodb中推荐使用,不适用MyISAM,此选项会开始备份前,先执
行START TRANSACTION指令开启事务此选项通过在单个事务中转储所有表来创建一致的快照。仅适用于存储在支持多版本控制的存储引擎中的表(目前只有InnoDB可以); 转储不保证与其他存储引擎保持一致。

? 在进行单事务转储时,要确保有效的转储文件(正确的表内容和二进制日志位置),需要保证没有其他连接使用以下语句:ALTER TABLE,DROP TABLE,RENAME TABLE,TRUNCATE TABLE

? 此选项和 --lock-tables(此选项隐含提交挂起的事务)选项是相互排斥备份大型表时,建议将--single-transaction选项和--quick结合一起使用

InnoDB建议备份策略:
    mysqldump –uroot –A –F –E –R  --single-transaction --master-data=1 --flush-privileges  --triggers --hex-blob >$BACKUP/fullbak_$BACKUP_TIME.sql

MyISAM建议备份策略:
    mysqldump –uroot –A –F –E –R –x --master-data=1 --flush-privileges  --triggers --hex-blob >$BACKUP/fullbak_$BACKUP_TIME.sql
 
  • xtrabackup工具:由Percona提供支持对InnoDB做热备(物理备份)的工具,支持完全备份、增量备份

由Percona公司提供的mysql数据库备份工具,开源的能够对innodb和xtradb数据库进行热备的工具;

xtrabackup 是用来备份 InnoDB 表的,不能备份非 InnoDB 表;

innobackupex 脚本用来备份非 InnoDB 表,同时会调用 xtrabackup 命令来备份 InnoDB 表,还会和 MySQL Server 发送命令进行交互,如加全局读锁(FTWRL)、获取位点(SHOW SLAVE STATUS)等。即innobackupex是在xtrabackup 之上做了一层封装实现的;

虽然目前一般不用 MyISAM 表,只是 MySQL 库下的系统表是 MyISAM 的,因此备份基本都通过 innobackupex 命令进行;

xtrabackup版本升级到2.4后,相比之前的2.1有了比较大的变化:innobackupex 功能全部集成到 xtrabackup 里面,只有一个 binary程序,另外为了兼容考虑,innobackupex作为 xtrabackup 的软链接,即xtrabackup现在支持非Innodb表备份,并且Innobackupex在下一版本中移除,建议通过xtrabackup替换innobackupex。

参考手册:https://www.percona.com/doc/percona-xtrabackup/LATEST/index.html

使用innobakupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。这些文件会被保存至一个以时间命名的目录中,在备份时,innobackupex还会在备份目录中创建如下文件:

1)xtrabackup_checkpoints:备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息,每个InnoDB页(通常为16k大小)都会包含一个日志序列号,即LSN。LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的;

2)xtrabackup_binlog_info:MySQL服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置;

3)xtrabackup_info:innobackupex工具执行时的相关信息;

4)backup-my.cnf:备份命令用到的配置选项信息;

5)xtrabackup_logfile:备份生成的日志文件。

用法:
    innobackupex --user=DBUSER --password=DBUSERPASS /path/to/BACKUP-DIR/
选项:
    --user:该选项表示备份账号
    --password:该选项表示备份的密码
    --host:该选项表示备份数据库的地址
    --databases:该选项接受的参数为数据名,如果要指定多个数据库,彼此间需要以空格隔开;如:"xtra_test dba_test",同时,在指定某数据库时,也可以只指定其中的某张表。如:"mydatabase.mytable"。该选项对innodb引擎表无效,还是会备份所有innodb表
    --defaults-file:该选项指定从哪个文件读取MySQL配置,必须放在命令行第一个选项位置
    --incremental:该选项表示创建一个增量备份,需要指定--incremental-basedir
    --incremental-basedir:该选项指定为前一次全备份或增量备份的目录,与--incremental同时使用
    --incremental-dir:该选项表示还原时增量备份的目录
    --include=name:指定表名,格式:databasename.tablename
    --apply-log:一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。此选项作用是通过回滚未提交的事务及同步已经提交的事务至数据文件使数据文件处于一致性状态
    --use-memory:该选项表示和--apply-log选项一起使用,prepare 备份的时候,xtrabackup做crash recovery分配的内存大小,单位字节。也可(1MB,1M,1G,1GB),推荐1G
    --export:表示开启可导出单独的表之后再导入其他Mysql中
    --redo-only:此选项在prepare base full backup,往其中merge增量备份时候使用
    --copy-back:做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir
    --move-back:这个选项与--copy-back相似,唯一的区别是它不拷贝文件,而是移动文件到目的地。这个选项移除backup文件,用时候必须小心。使用场景:没有足够的磁盘空间同事保留数据文件和Backup副本
注意:

1)datadir目录必须为空。除非指定innobackupex --force-non-empty-directorires选项指定,否则--copy-backup选项不会覆盖;

2)在restore之前,必须shutdown MySQL实例,不能将一个运行中的实例restore到datadir目录中;

3)由于文件属性会被保留,大部分情况下需要在启动实例之前将文件的属主改为mysql,chown -R mysql:mysql /data/mysqldb

  • mysqlbackup工具:热备份,MySQL Enterprise Edition组件
  • mysqlhotcopy工具:几乎冷备,仅适用于MyISAM存储引擎
  • 基于lvm快照备份:几乎热备,需要在拍快照前锁表
  • tar + cp 等归档复制工具备份:完全冷备

三、备份方案

、cp + tar == 物理冷备(不推荐)

1、备份:

~]# mkdir /backup
~]# systemctl stop mariadb #停止服务
~]# tar Jcf /backup/mariadb_all.tar.xz /var/lib/mysql/ #打包压缩
backup]# systemctl start mariadb
 

2、还原:

~]# systemctl stop mariadb
~]# rm /var/lib/mysql/ -rf  #将损坏的库删除
~]# cd /backup/
backup]# tar xf mariadb_all.tar.xz  #解压打包的数据库文件
backup]# cp -av var/lib/mysql/ /var/lib/ #还原
backup]# systemctl start mariadb #启动服务,恢复成功

二、备份

1、创建一个逻辑卷

[[email protected] ~]#fdisk /dev/sdan        新建磁盘回车     默认选项+15G    给15G大小t       列出类型8e      选择8e LVM逻辑卷w       保存退出

[[email protected] ~]#partprobe      同步

[[email protected] ~]#lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 200G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 50G 0 part /
├─sda3 8:3 0 30G 0 part /date
├─sda4 8:4 0 512B 0 part
├─sda5 8:5 0 2G 0 part [SWAP]
└─sda6 8:6 0 15G 0 part
sr0 11:0 1 8.1G 0 rom /mnt/cdrom

2、创建物理卷组,将pv加入逻辑卷组

[[email protected] ~]#pvcreate /dev/sda6   #创建物理卷
  Physical volume "/dev/sda6" successfully created.
[[email protected] ~]#vgcreate vg0 /dev/sda6   #创建逻辑卷组vg0,将物理卷加入逻辑卷组
  Volume group "vg0" successfully created

3、创建2个逻辑卷,分别存放数据库文件和二进制文件并格式化


[[email protected] ~]#lvcreate -L 5G -n mysql vg0
Logical volume "mysql" created.
[[email protected] ~]#lvcreate -L 3G -n binlog vg0
Logical volume "binlog" created.

[[email protected] ~]#mkfs.xfs /dev/vg0/mysql[[email protected] ~]#mkfs.xfs /dev/vg0/binlog

4、将这个盘设置为自动挂载 ,并修改配置文件

vim /etc/fstab

[mysqld]
log_bin=/date/binlog/mysql-bin(生成文件名为mysql-bin前缀,后面是 00001.....)     #设置为启用二进制文件并制定目录
datadir=/date/mysql                #指定数据库目录
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.

4、重启mariadb服务,给数据库临时加锁

MariaDB [(none)]> flush tables with read lock;   #加锁

MariaDB [(none)]> show master logs;           #查看日志
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 30343 |
| mysql-bin.000002 | 1038814 |
| mysql-bin.000003 | 7655 |
+------------------+-----------+

5、刷新日志,分别出之前日志(最后一个为最新刷新的日志)

MariaDB [(none)]> flush logs;
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |     30343 |
| mysql-bin.000002 |   1038814 |
| mysql-bin.000003 |      7698 |
| mysql-bin.000004 |       245 | #最新日志
+------------------+-----------+

6、对数据库文件创建快照,有了备份,就可以给数据库解锁了

[[email protected] ~]#lvcreate -L 1G -n mysql-kz -s -pr /dev/vg0/mysql
Using default stripesize 64.00 KiB.

[[email protected] ~]#mysql

MariaDB [(none)]> unlock tables;     #解锁
  Query OK, 0 rows affected (0.00 sec)

7、将快照挂载到mnt下 , 然后将mnt下的所有内容复制到事先创建好的backup文件夹内

[[email protected] ~]#mount -o nouuid,norecovery /dev/vg0/mysql-kz /mnt     #挂载快照
mount: /dev/mapper/vg0-mysql--kz is write-protected, mounting read-only   

[[email protected] ~]#mkdir /backup
  [[email protected] ~]#cp -av /mnt/* /backup/    #备份文件

  取消挂载 , 移除快照

[[email protected] ~]#umount /mnt
[[email protected] ~]#lvremove /dev/vg0/mysql-kz
Do you really want to remove active logical volume vg0/mysql-kz? [y/n]: y
  Logical volume "mysql-kz" successfully removed

8、到这里所有备份都已经 完成,接下来要恢复数据库了;在这之前,假如我们先对数据库进行简单的修改,新建一个数据库db2

[[email protected] ~]#mysql
MariaDB [(none)]> create database db2;
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db2                |
| hellodb            |
| mysql              |
| performance_schema |
| test               |
+--------------------+

接下来 我们要先停止数据库服务,然后删库

[[email protected] ~]#systemctl stop mariadb
[[email protected] ~]#rm -rf /date/mysql/*

当我们发现数据库被删,或硬盘损坏都已经修好之后, 就开始恢复数据了,首先将我们备份的文件复制到 mysql目录内

[[email protected] ~]#cp -av /backup/* /date/mysql
[[email protected] ~]#systemctl start mariadb

这时 我们发现 mysql 可以用了,但是 在之前创建的数据库db2 并没有恢复

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hellodb            |
| mysql              |
| performance_schema |
| test               |
+--------------------+   并没有db2 数据库

9、我们可以用数据库的二进制文件进行恢复,但恢复之前要对数据库进行加锁,防止用户在恢复过程中对数据库修改。

MariaDB [(none)]> flush tables with read lock;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |     30343 |
| mysql-bin.000002 |   1038814 |
| mysql-bin.000003 |      7698 |
| mysql-bin.000004 |       458 |
| mysql-bin.000005 |       245 |  #此时最新日志为5了
+------------------+-----------+

10、我们进到 /date/binlog 目录内, 将二进制文件导出 到backup 文件夹内 ,为了防止用户访问,可以禁止网络连接,写在配置文件内

[[email protected] binlog]#mysqlbinlog --start-position=458 mysql-bin.000004 > /backup/bin.sql  #这里的000004二进制文件表示 000004以后 的所有修改数据都备份,但仅仅针对于000004 这一个二进制文件
[[email protected] binlog]#mysqlbinlog mysql-bin.000005 >> /backup/bin.sql    #将000005以后二进制文件的文件 追加到 一个新的文件内

[mysqld]
  skip_networking
  log_bin=/date/binlog/mysql-bin
  datadir=/date/mysql
  socket=/var/lib/mysql/mysql.sock
  # Disabling symbolic-links is recommended to prevent assorted security risks

重启服务,检查一下3306端口 是否打开, 没有则为关闭,可以随意恢复了

[[email protected] binlog]#systemctl restart mariadb
[[email protected] binlog]#ss -tnl
State       Recv-Q Send-Q         Local Address:Port                        Peer Address:Port
LISTEN      0      128                        *:111                                    *:*
LISTEN      0      128                        *:22                                     *:*
LISTEN      0      128                127.0.0.1:631                                    *:*
LISTEN      0      128                       :::111                                   :::*
LISTEN      0      128                       :::22                                    :::*
LISTEN      0      128                      ::1:631                                   :::*
[[email protected] binlog]#

11、我们将最新的二进制日志导入数据库,然后将网络开启,重启服务

[[email protected] binlog]#mysql < /backup/bin.sql
[[email protected] binlog]#vim /etc/my.cnf      删除 skip_networking 删除即可[[email protected] binlog]#systemctl restart mariadb

测试一下  看看是否恢复成功

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db2                |   #db2 已经恢复
| hellodb            |
| mysql              |
| performance_schema |
| test               |
+--------------------+

原文地址:https://www.cnblogs.com/huxiaojun/p/9190891.html

时间: 2024-10-09 08:54:37

Linux九阴真经之九阴白骨爪残卷12(备份还原)的相关文章

Linux九阴真经之九阴白骨爪残卷13()

备份还原案例 前提:log_bin=ON 一.早上上班后误删数据库,如何恢复数据库 1.假设早上已经完成备份 (开启二进制),然后在students表里新增了一条数据 [[email protected] ~]#mysqldump -A -F --single-transaction --master-data=2 > /backup/full.sqlMariaDB [hellodb]> insert students values (26,'laobai',30,'M',7,2); 2.然后

Linux九阴真经之九阴白骨爪残卷11(并发访问控制和事务Transactions)

一.并发访问控制 实现的并发访问的控制技术是基于锁: 锁分为表级锁和行级锁,MyISAM存储引擎不支持行级锁:InnoDB支持表级锁和行级锁: 锁的分类有读锁和写锁,读锁也被称为共享锁,加读锁的时候其他的人可以读:写锁也称为独占锁或排它锁,一个写锁会阻塞其他读操作和写操作: 锁还分为隐式锁和显式锁,隐式锁由存储引擎自行管理,显式锁是用户手动添加锁: 锁策略:在锁粒度及数据安全性寻求的平衡机制. 显式锁的使用方法:LOCK TABLES tbl_name READ|WRITE MariaDB [s

Linux九阴真经之九阴白骨爪残卷1(加密和安全)

CA和证书 1.KPI :公共秘钥体系 签证机构:CA 注册机构:RA 证书吊销列表:CRL 证书存取库 509:定义了证书的结构以及认证协议标准 版本号序列号签名算法                   主体公钥         颁发者                      CRL分发点有效期限                    扩展信息主体名称                   发行者签名 证书类型: 证书授权机构的证书 服务器 用户证书 获取证书两种方法: ?使用证书授权机构 生

Linux九阴真经之九阴白骨爪残卷2(SSH)

SSH ssh:安全的远程登录 两种方式的用户登录认证 基于passwork 基于key 客户端 常见的客户端工具有:Windows版的putty.securecrt.xshell:linux中有ssh.sftp.scp.slogin等 配置文件: /etc/ssh/ssh_config ssh命令 用法:ssh  [email protected]   CMD 选项: -p   port :  远程服务器监听端口 -b          :  指定连接的源IP -v          :  调

Linux九阴真经之九阴白骨爪残卷5(ansible用法二之Playbook和YAML语法)

playbook是由一个或多个"play"组成的列表 play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色.从根本上来讲,所谓task无非是调用ansible的module.将多个play组织在一个playbook中,即可让他们联通起来按事先编排的机制运行. Playbook 采用yaml 语言编写每一个ansible 的 playbook 都是一个yaml格式的文件,因此要学习编写剧本(playbook), 我们先来了解 yaml 语法的基

Linux九阴真经之九阴白骨爪残卷15

一.MySQL复制相关概念 1.主从复制:主节点将数据同步到多个从节点 2.级联复制:主节点将数据同步到一个从节点,其他的从节点在向从节点复制数据 3.同步复制:将数据从主节点全部同步到从节点时才返回给用户的复制策略叫同步复制 4.异步复制:只要数据写入到主节点就立即返回给用户同步完成 5.读写分离:在前端加一个调度器,负责将改变数据的语句和查询数据的语句分开调度,把写操作调度到主节点,读操作调度到从节点 主节点: dump Thread:为每个Slave的I/O Thread启动一个dump线

Linux九阴真经之九阴白骨爪残卷8(存储函数、存储过程、触发器)

存储函数 说明: 参数可以有多个,也可以没有参数,必须有且只有一个返回值. 1.系统函数 参考官方文档:https://dev.mysql.com/doc/refman/5.7/en/func-op-summary-ref.html 2.自定义函数(user-defined function:UDF) 自定义函数保存在mysql.proc表中 查看UDF列表 SHOW FUNCTIOIN STATUS; 查看UDF定义 SHOW CREATE FUNCTION function_name 删除U

Linux下手动备份还原硬盘主引导记录MBR跟硬盘分区表DPT教程

Linux下手动备份还原硬盘主引导记录MBR跟硬盘分区表DPT教程 二 18 奶牛 Linux, Ubuntu, Windows 1,885 views查看评论 最近奶牛一直在折腾linux下的grub跟grub2,因为前阵子用ghost恢复windows的时候出现错误,导致分区表被破坏,无法进入系统.今天给大家介绍下如何备份跟还原我们的硬盘主引导扇区.首先我来介绍下这个硬盘主引导扇区,因为对于这个主引导记录MBR跟这个硬盘分区表DPT的关系,可能有的朋友还不是那么清晰. 硬盘主引导扇区(硬盘的

Linux系统备份还原脚本

\ #!/bin/sh #备份linux系统. #命令如:sh 当前脚本.sh /dev/sdax 备份文件名 #参数1:备份的盘,备份前先umount.如:/dev/sda1 #参数2:备份保存的文件名. if [ $# -ne 2 ]; then echo "请传入两个参数." exit 0 fi #当前日期,用于建立临时文件夹和备份文件. datename=`date +%Y%m%d_%H%M%S` #临时挂载的文件夹名称 tmpdir="/tmp/dir${daten