在上一期我们说到了两种办法来执行备份mariadb,第一种使用的是冷备的方案使用cp命令来执行备份数据库,这种办法我完全不推荐!如果数据库较大时cp的话会占用太多时间,而且如果数据库处于关闭状态那么如果这个时候有人对网站的动态页面(数据库)进行查询,那么结果可想而知!
第二种办法是使用mysqldump+cp二进制日志文件来执行备份,这种办法对于小型站点非常合适(wordpress也一样),没有成本问题而且在InnoDB引擎上支持热备(现在大多数使用mariadb的都用InnoDB存储引擎)不过这并不代表mysqldump没有任何问题,对于大于10GB以上的存储数据库来说你会发现备份速度越来越慢。有可能上百G或者TB系列的数据库对于mysqldump在机械硬盘上要跑上一晚上。所以备份的时间可能是一个非常头疼的问题!
接下来我来介绍第三种办法:使用LVM卷的快照功能来备份数据库!
首先我们创建一个LVM的磁盘:
#首先我们来看看我在虚拟机上挂载的磁盘是否OK? [root@localhost ~]# ls /dev/sd* #然后创建一个磁盘: [root@localhost ~]# fdisk /dev/sdb Welcome to fdisk (util-linux 2.23.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Device does not contain a recognized partition table Building a new DOS disklabel with disk identifier 0x4a175bbd. Command (m for help): p #打印输出这个未规划的磁盘 Disk /dev/sdb: 8589 MB, 8589934592 bytes, 16777216 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0x4a175bbd Device Boot Start End Blocks Id System Command (m for help): n #new一个新分区 Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p #选择主分区还是逻辑分区 Partition number (1-4, default 1): 1 #1号主分区 First sector (2048-16777215, default 2048): Using default value 2048 Last sector, +sectors or +size{K,M,G} (2048-16777215, default 16777215): Using default value 16777215 Partition 1 of type Linux and of size 8 GiB is set #到这里就算把这个磁盘创建完毕 Command (m for help): t #调整分区ID Selected partition 1 Hex code (type L to list all codes): L #查看可以填写的磁盘类型 Command (m for help): w #写入操作 The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. #磁盘就算创建完毕了!
第二步:开始创建文件系统首先需要创建PV:
[root@localhost ~]# pvcreate /dev/sdb1 -bash: pvcreate: command not found #上面出现没有该命令,我是最小化安装的没有lvm2的包,所以遇到LVM没有该命令的执行yum install -y lvm2进行安装 [root@localhost ~]# pvcreate /dev/sdb1 #创建一个PV注意写明设备名 Physical volume "/dev/sdb1" successfully created [root@localhost ~]# pvs #查看PV PV VG Fmt Attr PSize PFree /dev/sdb1 lvm2 --- 8.00g 8.00g [root@localhost ~]# vgcreate cookiesvg /dev/sdb1 #创建一个VG组,记得得给组名。 Volume group "cookiesvg" successfully created [root@localhost ~]# lvcreate -L 5G -n cookieslv cookiesvg #创建LV卷指明大小,这样LVM就算创建成功了,但别着急还没有文件系统是不? Logical volume "cookieslv" created. [root@localhost ~]# mkfs.ext4 /dev/mapper/cookiesvg-cookieslv #创建文件系统 mke2fs 1.42.9 (28-Dec-2013) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 327680 inodes, 1310720 blocks 65536 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=1342177280 40 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736 Allocating group tables: done Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done #创建一个文件用来进行挂载 [root@localhost ~]# mkdir /sqldata [root@localhost ~]# mount /dev/mapper/cookiesvg-cookieslv /sqldata [root@localhost ~]# cd /sqldata/ [root@localhost sqldata]# ll #查看sqldata有哪些文件 total 16 drwx------ 2 root root 16384 Jul 25 10:44 lost+found #至此LVM的相关内容就算创建完毕!
第三步:更改数据库的相关选项将数据库导入到LVM卷上:
vi /etc/mysql/my.cnf #首先进入mariadb的主配置文件 #修改一个选项: datadir = /sqldata #修改为LVM卷的路径 #随后将原先的数据库的内容移动到/sqldata,这里我就不详细说明了! [root@localhost var]# systemctl restart mysqld #重新启动失败 Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details. #刚刚上面的问题,我百思不得其解,最后看了日志才慢慢醒悟: [root@localhost var]# tail /var/log/messages Jul 25 10:48:17 localhost mysqld: <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">Shutting down MySQL... ERROR! The server quit without updating PID file</span> #就是这里(/sqldata/localhost.localdomain.pid). Jul 25 10:48:17 localhost systemd: mysqld.service: control process exited, code=exited status=1 Jul 25 10:48:17 localhost systemd: Unit mysqld.service entered failed state. Jul 25 10:48:17 localhost systemd: mysqld.service failed. Jul 25 10:48:17 localhost systemd: Starting LSB: start and stop MySQL... Jul 25 10:48:18 localhost mysqld: Starting MySQL. ERROR! Jul 25 10:48:18 localhost systemd: mysqld.service: control process exited, code=exited status=1 Jul 25 10:48:18 localhost systemd: Failed to start LSB: start and stop MySQL. Jul 25 10:48:18 localhost systemd: Unit mysqld.service entered failed state. Jul 25 10:48:18 localhost systemd: mysqld.service failed. #原因就是/sqldata的属主属组不是mysql所以才会启动报错pid文件无法写入。 [root@localhost /]# chown -R mysql:mysql sqldata/ #更改完毕别忘了启动数据库! MariaDB [(none)]&gt; SHOW DATABASES; #查看数据库 +---------------------+ | Database | +---------------------+ | #mysql50#lost+found | #我也是醉了,竟然吧lost+found的自带文件也显示数据库。 | cookiesinn | | information_schema | | mysql | | performance_schema | +---------------------+ 5 rows in set (0.01 sec) #我们的要恢复数据库是cookiesinn,不过第三步就算结束了!
第四步:使用LVM2快照备份mariadb
MariaDB [(none)]&gt; FLUSH TABLES WITH READ LOCK; #锁定所有表为只读锁 Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]&gt; FLUSH LOGS; #刷新日志 Query OK, 0 rows affected (0.08 sec) MariaDB [(none)]&gt; SHOW MASTER STATUS; #查看日志的位置记住位置(Position)和文件名 +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | slave_bin.000007 | 365 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.17 sec) MariaDB [(none)]&gt; exit; Bye [root@localhost mapper]# lvcreate -L 1G -n cookiesinnback -p r -s /dev/mapper/cookiesvg-cookieslv #创建一个快照 Logical volume "cookiesinnback" created. MariaDB [(none)]&gt; UNLOCK TABLES; #最后进入mariadb执行解锁。 Query OK, 0 rows affected (0.00 sec) [root@localhost /]# mkdir sqlback #从这一步开始将快照内容复制到其他盘片上去! [root@localhost /]# mount /dev/mapper/cookiesvg-cookiesinnback /sqlback/ #将快照挂载到刚创建的文件 mount: /dev/mapper/cookiesvg-cookiesinnback is write-protected, mounting read-only #这边提示快照只能只读 [root@localhost ~]# cd /sqlback [root@localhost sqlback]# tar -czvf /root/back.tar.gz * #将所有文件打包到/root下面 #好了备份问题就算完成了!
第五步:使用LVM2进行对数据库恢复:
MariaDB [(none)]&gt; CREATE DATABASE test1; #首先创建一个空数据库 Query OK, 1 row affected (0.00 sec) MariaDB [(none)]&gt; DROP DATABASE cookiesinn; #删除cookiesinn数据库 Query OK, 35 rows affected (5.93 sec) [root@localhost ~]# tar -xf back.tar.gz -C /sqldata/ #将文件释放到/sqldata进行覆盖,最新的日志在重启时肯定用新的来写了! MariaDB [(none)]&gt; SHOW DATABASES; #东西都在 +---------------------+ | Database | +---------------------+ | #mysql50#lost+found | | cookiesinn | | information_schema | | mysql | | performance_schema | | test1 | +---------------------+ 6 rows in set (0.06 sec) #如果实在不放心或者LVM硬盘坏了数据全部丢失的话可以执行二进制恢复 [root@localhost sqldata]# mysqlbinlog --start-position=365 slave_bin.000008 | mysql cookiesinn #至此LVM2的快照备份讲解搞定!
接下来隆重推出第四种重量级办法:用xtrbackup进行备份!
什么是xtrbackup?
Xtrabackup是由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工具。特点:
(1)备份过程快速、可靠;
(2)备份过程不会打断正在执行的事务;
(3)能够基于压缩等功能节约磁盘空间和流量;
(4)自动实现备份检验;
(5)还原速度快;
听到这里是不是感觉救星来了?那么如果安装呢?
首先去percona找到xtrbackup的下载页,在这里:https://www.percona.com/downloads/XtraBackup/LATEST/ 建议自己去官网找不要点我的链接,锻炼一下呗!选择好版本和对应的操作系统会出现N个包组我来讲解一下:
其中第一个包组就是全部的安装包,如果公司没有开发实力建议别下载。第二个包才是我们需要的包!第三个为排错包,如果非常熟练这个工具的童鞋可以下载以便不时之需,第四个包是测试包和第一个包一样没有开发实力的别下了!
我选择第二个包邮件获取对应的链接然后使用wget 下载和安装:
[root@localhost sqldata]# wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.3/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.3-1.el7.x86_64.rpm https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.3/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.3-1.el7.x86_64.rpm Resolving www.percona.com (www.percona.com)... 74.121.199.234 Connecting to www.percona.com (www.percona.com)|74.121.199.234|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 7867760 (7.5M) [application/x-redhat-package-manager] Saving to: ‘percona-xtrabackup-24-2.4.3-1.el7.x86_64.rpm’ 100%[===================================================================&gt;] 7,867,760 45.2KB/s in 5m 17s 2016-07-25 14:25:20 <span style="color: rgb(255, 0, 0);" data-mce-style="color: #ff0000;">(24.2 KB/s)</span> - ‘percona-xtrabackup-24-2.4.3-1.el7.x86_64.rpm’ saved [7867760/7867760] #真不是到电信最近又咋了是不是G20峰会开了又开始限制国外入国内流量了?百兆带宽神马的都是骗小孩的...现在交钱接百兆网的人多了但是电信赚钱之后你懂得...国际带宽从来就没改过(企业包国际专线神马的都是按照$算)...给咱老百姓个2兆国际带宽也好啊现在的带宽堪比当年的电话线...电信你这么“会赚钱”你**知道不? [root@localhost ~]# yum install -y epel-release #安装之前首先得添加epel源! [root@localhost ~]# yum install percona-xtrabackup-24-2.4.3-1.el7.x86_64.rpm #这样就安装完毕了!
第一步:使用xtrabackup完全备份:
[root@localhost var]# mkdir /var/xtrabackup #创建一个用于备份xtrabackup的文件 [root@localhost var]# innobackupex --user=root /var/xtrabackup/ #来吧开始备份吧,我这个数据库为测试没有密码,有数据库密码的同学可以加上--password= 如果感觉不安全可以添加一个最小权限的用户只能对数据库进行备份,施加锁等操作 [root@localhost var]# ls xtrabackup/ 2016-07-25_14-49-14 #备份完毕了?还没呢!接着往下看
第二步:“准备”完全备份:
刚刚备份好的确实是完全备份,但是不能对数据库恢复。因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。
[root@localhost var]# innobackupex --apply-log xtrabackup/2016-07-25_14-49-14/ #开始执行“准备”备份 #最后出现这几句话就算成功: InnoDB: Starting shutdown... InnoDB: Shutdown completed; log sequence number 5401389 160725 14:56:10 completed OK! #OK!看看如何让完整备份进行恢复
第三步:使用完全备份恢复数据库
[root@localhost var]# rm -rf /sqldata/* #删除数据库下的所有文件 [root@localhost var]# systemctl stop mysqld #顺便停用mariadb,xtrabackup可以支持在mariadb服务停止也能恢复 [root@localhost var]# innobackupex --copy-back xtrabackup/2016-07-25_14-49-14/ #对数据库进行恢复 160725 15:01:11 completed OK! #出现上述字样表示成功恢复! MariaDB [(none)]&gt; SHOW DATABASES; #查看数据库: +---------------------+ | Database | +---------------------+ | #mysql50#lost+found | | cookiesinn | | information_schema | | mysql | | performance_schema | | test1 | +---------------------+ 6 rows in set (0.10 sec) #好了使用完全恢复搞定!
第四步:使用xtarbackup来增量备份:
由于对于数据库隆大的企业来说每次需要完全备份非常烦恼会占据大量的人力物力时间来备份数据,对数据压力也比较大。所以有增量备份简直就是福音啊,不知道增量备份看这里!
#为了演示效果我有添加了两个个数据库test2、test3。 MariaDB [(none)]> CREATE DATABASE test2 -> ; Query OK, 1 row affected (0.06 sec) MariaDB [(none)]> CREATE DATABASE test3; Query OK, 1 row affected (0.00 sec) [root@localhost var]# innobackupex --incremental xtrabackup/ --incremental-basedir=xtrabackup/2016-07-25_14-49-14/ #上述进行增量备份,第一个选项指明备份位置,第二个选项指明完全备份所在目录。如果有多个增量备份指明上一个增量备份所在的目录!不用指明完全备份所在目录 #接着我们对其增量备份进行“准备” innobackupex --apply-log --redo-only /var/xtrabackup/2016-07-25_16-56-58/ #首先准备就是对完全备份进行重放 innobackupex --apply-log --redo-only /var/xtrabackup/2016-07-25_16-56-58/ --incremental-dir=/var/xtrabackup/2016-07-25_16-58-43/ #随后在第一个增量配置文件进行回放 #如果有多个增量备份的话需要全部指明!
第五步:对增量备份做恢复
[root@localhost ~]# rm -rf /sqldata/* #删除所有数据库 [root@localhost ~]# systemctl stop mysqld #停止mariadb的服务 [root@localhost var]# innobackupex --copy-back /var/xtrabackup/2016-07-25_16-56-58/ #对数据库进行恢复,注意:恢复的时候只需选择完全备份的哪个文件夹即可! [root@localhost ~]# cd /sqldata/ [root@localhost sqldata]# chown -R mysql:mysql ./* #更改恢复的属组属主 MariaDB [(none)]> SHOW DATABASES; #查看数据库搞定! +---------------------+ | Database | +---------------------+ | #mysql50#lost+found | | cookiesinn | | information_schema | | mysql | | performance_schema | | test1 | | test2 | | test3 | +---------------------+ 8 rows in set (0.13 sec)
上述就是xtrabackup的说明,其实可以更加复杂,备份多个增量备份然就进行恢复。不过这么考验的实验还是得自己动手!
不过我在执行的过程中遇到了报错,在使用增量备份进行“准备”的第二次对“第一个增量备份进行回放”出现报错:
innobackupex version 2.4.3 based on MySQL server 5.7.11 Linux (x86_64) (revision id: 6a46905)
incremental backup from 5400818 is enabled.
xtrabackup: cd to /var/xtrabackup/2016-07-25_16-41-38
xtrabackup: This target seems to be already prepared with –apply-log-only.
InnoDB: Number of pools: 1
InnoDB: Operating system error number 2 in a file operation.
InnoDB: The error means the system cannot find the path specified.
xtrabackup: Warning: cannot open xtrabackup/2016-07-25_16-45-02//xtrabackup_logfile. will try to find.
InnoDB: Operating system error number 2 in a file operation.
InnoDB: The error means the system cannot find the path specified.
xtrabackup: Fatal error: cannot find xtrabackup/2016-07-25_16-45-02//xtrabackup_logfile.
xtrabackup: Error: xtrabackup_init_temp_log() failed.
首先我想到在选项中使用–apply-log-only将原先使用的选项–apply-log给替换掉,但是后来发现虽然能够执行但是它吧整个2016-07-25_16-41-38当作是一个数据库来进行备份导致看到数据库恢复以后使用SHOW DATABASES; 会看到2016-07-25_16-41-38的一个数据库…
这个问题困扰了我2个多小时,经过摸索(不断的重新从头开始)最后发现原来我每次使用的都是相对路径作为指明各种备份文件的选项,所以才会出现Warning: cannot open xtrabackup/2016-07-25_16-45-02//xtrabackup_logfile.虽然上文已经有xtrabackup: cd to /var/xtrabackup/2016-07-25_16-41-38。但是使用相对路径还是找不到文件的!最后我在/root目录中重新使用了绝对路径对整个数据库进行从完全备份–>增量备份–>恢复文件。结果都是成功的!
好了对于mariadb数据库的各种备份讲解完毕!
Comments