我想使用Commvault来备份和恢复运行在VMware虚拟机上的MariaDB(MySQL)数据库
注意:以下是验证操作及其结果以了解操作的内容。关于应用于生产环境,请确保进行适当的容量规划和预先验证。
基于 VADP 协作的 VMware 虚拟机备份中,经常引起讨论的是数据库的静止点保留问题。
如果在客户操作系统上安装了备份软件代理,则可以进行备份,但通过VADP备份和VMware功能进行备份/恢复,可以如何备份/恢复,我使用了MariaDB进行了尝试。
备份虚拟机的准备工作
我們這次使用的是 CentOS 7.6。
# cat /etc/centos-release
CentOS Linux release 7.6.1810 (Core)
#
安装Open VM工具。
在使用VADP(vSphere API for Data Protection)協作進行虛擬機器備份時,我們會使用虛擬機器的快照功能。對於安裝有Open VM Tools(VMware Tools)的虛擬機器,我們可以在創建快照時執行已經在客戶操作系統上安裝的腳本。因此,這次我們將通過這個腳本來執行MariaDB的鎖定和解鎖指令。
使用 yum 安装 open-vm-tools。
# yum install open-vm-tools -y
#
请启用vmtoolsd.service。
# systemctl enable vmtoolsd.service
# systemctl start vmtoolsd.service
#
稍后会使用在创建快照时使用的脚本
准备数据库(MariaDB)。
MariaDB用于创建测试数据库和表格。
安装MariaDB
我会使用Yum安装MariaDB。
# yum install mariadb-server.x86_64 -y
#
将MariaDB设置为自动启动。
# systemctl enable mariadb
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.
# systemctl start mariadb
#
测试用数据库、表的结构和数据的登记
使用MySQL命令登录到MariaDB数据库。
# mysql -u root
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.65-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
创建DB01数据库,并连接到DB01数据库。
MariaDB [(none)]> CREATE DATABASE DB01;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> use DB01;
Database changed
MariaDB [DB01]>
我們將創建用於測試的表格。為了在恢復時確認已回滾到哪個時間點,我們將在TIME列中放入發布INSERT指令的時間。
MariaDB [DB01]> CREATE TABLE TABLE01 (ID INT NOT NULL AUTO_INCREMENT, DATA VARCHAR(32), TIME TIMESTAMP, PRIMARY KEY (ID));
Query OK, 0 rows affected (0.00 sec)
MariaDB [DB01]>
使用INSERT语句将数据插入表中。然后使用SELECT语句来验证所需数据是否已经包含在内。
MariaDB [DB01]> INSERT INTO TABLE01 (DATA, TIME) VALUES (MD5(RAND()), NOW());
Query OK, 1 row affected (0.01 sec)
MariaDB [DB01]> INSERT INTO TABLE01 (DATA, TIME) VALUES (MD5(RAND()), NOW());
Query OK, 1 row affected (0.00 sec)
MariaDB [DB01]> INSERT INTO TABLE01 (DATA, TIME) VALUES (MD5(RAND()), NOW());
Query OK, 1 row affected (0.00 sec)
MariaDB [DB01]> select * from TABLE01;
+----+----------------------------------+---------------------+
| ID | DATA | TIME |
+----+----------------------------------+---------------------+
| 1 | e1e750366757e64f028581fdae0cbeb2 | 2020-05-28 17:07:30 |
| 2 | 7cb2894d667e43b29d76faf7c15e67c2 | 2020-05-28 17:07:32 |
| 3 | 11cc5d0f2396ff337cfe17b8cf99f4a0 | 2020-05-28 17:07:35 |
+----+----------------------------------+---------------------+
3 rows in set (0.00 sec)
MariaDB [DB01]>
确认了没有问题后,将会注销。
MariaDB [DB01]> exit
Bye
#
在进行测试时,可以发出以下类型的shell脚本,并且使用无限循环运行INSERT语句。
# while true
> do
> date
> mysql -uroot DB01 -e'INSERT INTO TABLE01 (DATA, TIME) VALUES (MD5(RAND()), NOW())'
> sleep 1
> done
Thu May 28 17:20:02 JST 2020
Thu May 28 17:20:03 JST 2020
Thu May 28 17:20:04 JST 2020
Thu May 28 17:20:05 JST 2020
Thu May 28 17:20:06 JST 2020
Thu May 28 17:20:07 JST 2020
^C
#
自定义静态脚本的配置
Commvault的文档网站(http://documentation.commvault.com/commvault/v11/article?p=32208.htm)上提供了MySQL(MariaDB)的自定义静态脚本示例,其中包括Python脚本的上传。但并非所有环境都安装有Python。
另外,在Python脚本中写了很多内容,但作为MySQL静态点保持机制,似乎流程是先使用FLUSH TABLES WITH READ LOCK对表进行锁定,然后创建虚拟机的快照,然后使用UNLOCK TABLES解锁,所以我编写了以下简单的脚本。
预冷冻脚本
在预冻结脚本中,将执行时间记录在 /scripts/pre-freeze-script.log 文件中,并执行 FLUSH TABLES WITH READ LOCK 操作。
# cat /usr/sbin/pre-freeze-script
#!/bin/bash
date >> /scripts/pre-freeze-script.log
mysql -uroot -e'FLUSH TABLES WITH READ LOCK'
#
解冻后脚本
在”解冻后脚本”中,将执行时间记录在/scripts/pre-freeze-script.log中,并发送UNLOCK TABLES命令。
# cat /usr/sbin/post-thaw-script
#!/bin/bash
date >> /scripts/post-thaw-script.log
mysql -uroot -e'UNLOCK TABLES'
#
虚拟机的备份
Commvault在执行虚拟机备份时,可以选择文件系统和应用程序一致的选项。选择这个选项后,会执行VMware Tools(Open VM Tools)的自定义静态脚本。
(1) 在开始备份任务之前,执行无限循环的插入语句。
# while true
> do
> date
> mysql -uroot DB01 -e'INSERT INTO TABLE01 (DATA, TIME) VALUES (MD5(RAND()), NOW())'
> sleep 1
> done
Thu May 28 20:51:12 JST 2020
Thu May 28 20:51:13 JST 2020
Thu May 28 20:51:14 JST 2020
Thu May 28 20:51:15 JST 2020
Thu May 28 20:51:16 JST 2020
...
执行备份作业。
(3) 备份完成后,将结束无限循环。
查看 pre-freeze-script.log 和 post-thaw-script.log 的内容。
# tail -n 1 /scripts/pre-freeze-script.log
Thu May 28 20:51:49 JST 2020
# tail -n 1 /scripts/post-thaw-script.log
Thu May 28 20:51:53 JST 2020
#
2020年5月28日(木曜日)20時51分49秒 JSTから2020年5月28日(木曜日)20時51分53秒 JSTまでの数据库应该已经备份了。
(5) 檢查儲存在資料庫中的資料。以下的 SQL 語句顯示最新的時間。
# mysql -uroot DB01 -e'SELECT MAX(TIME) FROM TABLE01'
+---------------------+
| MAX(TIME) |
+---------------------+
| 2020-05-28 21:08:51 |
+---------------------+
#
2020年5月28日星期四20:51:53日本標準時間(根據/scripts/post-thaw-script.log中的時間戳)之後的數據已經被輸入。
关于通过还原的数据库恢复。
Commvault 可以从 VMware 虚拟机的备份中恢复以下三种虚拟机模式。
-
- 仮想マシン全体のリストア
バックアップした仮想マシンを丸ごとリストアします。静止点が確保された状態で正常起動すればデータベースも復旧します。シンプルですがデータベース以外のファイルも丸ごと復旧されます。
仮想マシン上のファイルのリストア
仮想マシンのバックアップに含まれるファイル単位のリストアを行ないます。データベースのみ復旧したいような場合はこの方式が良いかもしれません。
仮想ディスクのリストア
既存の VM に VMDK ファイルをアタッチします。OS 上のコマンド使ってファイルをコピーします。このドキュメントでの説明は省略します。
通过虚拟机的恢复来进行数据库的恢复。
为了能够与备份源数据库进行比较,我们尝试将其作为一个与原始虚拟机不同的虚拟机进行还原。
在恢复后,启动虚拟机并检查预冻结脚本日志和后处理脚本日志中记录的最后时间。
# tail -n 1 /scripts/pre-freeze-script.log
Thu May 28 20:51:49 JST 2020
# tail -n 1 /scripts/post-thaw-script.log
Thu May 28 17:58:48 JST 2020
#
尽管 post-thaw-script.log 中的时间早于 pre-freeze-script.log 中的时间,但由于在 pre-freeze-script 执行后,在 post-thaw-script 执行之前进行了快照(虚拟磁盘的静态点),所以这是正确的状态。
从这个输出中,应该能够将2020年5月28日20:51:49(JST)(2020-05-28 20:51:49)之后的数据输入到数据库中。
我试着查看 TABLE01 的最新时间。
# mysql -uroot DB01 -e'SELECT MAX(TIME) FROM TABLE01'
+---------------------+
| MAX(TIME) |
+---------------------+
| 2020-05-28 20:51:50 |
+---------------------+
#
已经恢复到预期的状态。
通过对MariaDB数据文件的还原来恢复数据库。
这次不是整个虚拟机,而是只对MariaDB的数据文件进行恢复,以实现数据库的修复。
在保留数据库快照之后,类似于在备份操作中将数据库文件复制并进行备份的恢复方案。
要从Linux虚拟机的备份中进行文件级别的恢复,您需要准备Linux文件恢复启用程序(FREL)或在Linux操作系统上安装虚拟服务器代理(VSA)。
准备进行还原(删除数据库)
将 MariaDB 的数据文件夹完整移动,导致数据库文件被删除,使 MariaDB 无法启动。
(1) 停止 MariaDB 的守护进程。
# service mariadb stop
Redirecting to /bin/systemctl stop mariadb.service
#
(2) 移动 MariaDB 的数据文件夹。
# mv /var/lib/mysql /var/lib/mysql.bak
#
(3) 启动MariaDB的守护进程并确认它未启动。
# service mariadb start
Redirecting to /bin/systemctl start mariadb.service
Job for mariadb.service failed because the control process exited with error code. See "systemctl status mariadb.service" and "journalctl -xe" for details.
#
从虚拟机的备份中进行文件层面的恢复。
将/var/lib/mysql文件夹及其子文件夹中的文件恢复到/var/lib文件夹中。
在 Commvault 的 VMware 虚拟机备份中,您可以使用与 VMware Tools 配合使用的无需代理的还原功能。虽然可能存在无法返回符号链接信息等限制,但优点在于虚拟机的操作系统与备份服务器之间不需要进行通信。
Agentless恢复的大致流程如下。
数据库恢复确认
启动MariaDB守护程序,确保数据库恢复到预期的状态。
(1) 确认/var/lib/mysql文件夹已经恢复。
# ls -al /var/lib/ | grep mysql
drwxr-xr-x 6 mysql mysql 171 May 28 16:53 mysql
drwxr-xr-x 6 mysql mysql 171 May 28 22:16 mysql.bak
#
(2) 启动 MariaDB 的守护进程,并确认它能正常启动。
(如果 SELinux 处于启用状态,可能无法启动。在本次环境中,它已经被事先禁用。)
# service mariadb start
Redirecting to /bin/systemctl start mariadb.service
#
(3) 我确认在虚拟机恢复时,状态已经回到了与之前相同的状态。
# mysql -uroot DB01 -e'SELECT MAX(TIME) FROM TABLE01'
+---------------------+
| MAX(TIME) |
+---------------------+
| 2020-05-28 20:51:50 |
+---------------------+
#