IRIS镜像配置(3)
把数据库添加进Mirror
以往的经验里, 用户在把数据库添加到镜像时遇到过各种各样的问题,以致必须请求外部帮助才能解决。除了步骤本身比较繁琐,很大的原因是阅读文档不细致。还有一个,就是对英文水平不太高的用户,有些英文句式并不是很好懂,比如说,文档中有这一句其实非常关键:
If you attempt to add a new database to the mirror on a nonprimary member that was not created as a mirrored database on the primary, but rather added to the mirror after it was created, an error message notes this and you cannot complete the operation.
我用最好的翻译器DeepL翻译后的中文是:
如果你试图在一个非主要成员上向镜像添加一个新的数据库,而这个数据库并不是在主要成员上作为镜像数据库创建的,而是在创建后添加到镜像中的,那么就会出现错误信息提示,你无法完成操作。
很讨厌的是它没用说明错误信息是什么,以致于很多用户, 当他们在Backup成员中把一个数据库添加到镜像时,遇到相关的错误时,没有把问题和这句话关联起来,这个错误提示是这样的:
“错误 #2105: 与成员 SERVERA/IRIS 中的相匹配的数据库 :mirror:AUGEST:DEMO 未被创建为镜像数据库”。
或者用英文,
ERROR #2105: Matching mirrored DB :mirror:AUGEST:DEMO in member SERVERA/IRIS was not created as mirrored DB
我来解释一下这句话,它说的是: ”嘿, 你在本机要添加的:mirror:AUGEST:DEMO数据库, 它在主镜像成员SERVERA/IRIS里, 未被创建为镜像数据库。“
如果您看了我的解释, 还觉得莫名其秒,我相信您其实是没懂这个关键点:
“一个数据库创建成镜像数据库,和创建成普通数据库后面后再添加到镜像里,它们是不同的。”
关于这一点,其实文档也有说明,啰嗦,但说明了原因。直接上翻译:
创建镜像数据库(即添加一个不含数据的新数据库)的过程与向镜像添加现有数据库的过程不同。作为镜像数据库创建的数据库上的Global操作从一开始就被记录在镜像Journal中,因此镜像可以访问它所需要的所有数据,以便在镜像成员之间同步数据库。但现有数据库在被添加到镜像之前的Global操作包含在非镜像Journal文件中,镜像不能访问这些文件。由于这个原因,一个现有的数据库在被添加到镜像后,必须在主故障转移成员上进行备份,并在备份故障转移成员和它要所在的任何异步成员上进行恢复。一旦这样做了,你必须激活并赶上数据库,使其与主数据库保持同步。
清楚了这个关键, 您才能理解为什么安装步骤分为下面的两个类型,
- 创建新的镜像数据库
- 将已有的数据库加入镜像
TIP: 另外,还有一个值得提醒的:只有用户自己的数据库可以被加入镜像。系统本身的数据库, 比如IRISSYS, IRISLIB, IRISTEMP等等,都不能加入镜像。早期有些版本可以,NOMORE!
创建新的镜像数据库
- 在主镜像成员的系统维护界面上,选择System Administration – Configuration – System Configuration – Local Databases , 选择Create New Database. 在数据库创建向导窗口,在“镜像数据库?”下拉菜框,选择'是‘(Yes)。
<img src="/sites/default/files/inline/images/image-20220915132341910.png" alt="" style="zoom: 33%/>
创建成功后,维护界面会回到数据库创建页面。在下面数据库列表里,您可以看到的NEWDB前面加入了镜像的名称AUGUEST。
查看镜像监视器, 您会看到这个数据库已经成功添加入了镜像,状态为“一般”。英文原文为“Normal”,请无视优秀的翻译。
Tip: 要把数据库从镜像里移除,在“系统操作>镜像监视器“里操作。
这时候您如果去其他的镜像成员的镜像监视器里查看, 会发现如下的内容, 表示这个成员已经收到了Primary的消息:"嘿,我主机上把这个数据库加到了镜像里。"
- 在每一个镜像成员中, 无论是backup还是异步成员,创建相同名字的本地数据库。同样的操作,选择相同的文件路径,同样在“镜像数据库?”下拉框回答Yes。创建好之后,您会看到镜像监视器里,这个数据库已经添加成功。如果在您当前操作的机器上查看镜像监视器, 您会发现和Primary里看到的稍有不同, 象这样:
(注意它的状态是Dejournaling, 表示它在正常的接收或者准备接收主机发来的数据同步)
- 检查数据库工作正常
- 在所有的镜像成员上一个个的创建使用NEWDB的命名空间。在各个机器上必须保持一致,一样的名称,一样的资源等等。(理论上不必要,但维护中非常必要)
- 在Primary上做一个数据库操作。我喜欢在“系统资源管理器>SQL"页面执行SQL语句,比如
CREATE TABLE Persons(Id int, Name varchar(255))
。注意先要切换到创建的命名空间 - 在所有的镜像成员上, 查看“系统资源管理器>SQL"页面, 确认表Persons同步到了所有的镜像成员。
这里如果您遇到上面提到的“Error 2105“, 那就是这个数据库在Primary上先是创建成一般数据库,然后加入的镜像,那您应该按下面的步骤操作了。
如果有人好奇:在Primary上的这种区别,Backup是怎么知道的,它不是还没加入到镜像吗? 故事是这样的: 镜像日志中同步的不是只有镜像数据库的数据的修改, 还包括IRISSYS, IRISAUDIT,等库的内容。NEWDB在主成员中是怎么加入到镜像的, IRISSYS里的Global Set是不一样的,而这个set, 是同步给备用成员backup的。 又一个没用的知识。
将已有的数据库加入镜像
已有的(Existing)数据库是指原本在主成员里按普通数据库创建的,然后加入镜像的数据库。
这样的情况,哪怕同样名称,配置的数据库在其他成员上已经有了。能直接加入镜像吗?比如你主成员上有个User, 备用成员上也有,您能在主机, 备机直接把它们加入镜像吗?
答案是肯定不行。系统根本没法保证这两个库里面已有的数据是一样的。您要在主成员上备份数据库,在其他成员恢复, 而恢复操作成功后,在其他成员上,这个数据库自动变成了“镜像数据库”, 也就是加入了镜像。
这个同名的数据库要先在其他成员上创建。创建成普通数据库。如果其他成员上已经有了,也不用删除,就直接用主机的备份文件覆盖就好。
以下是详细的步骤:
- 在主机的“系统>配置>本地数据库“页面, 点击添加到镜像按钮。然后在跳出窗口中选中您要添加的数据库,可以一次选多个。 数据库很大或者多个数据库同时加入是,可以选中”在后台运行“。通常这个添加动作是在秒级时候内完成的,无所谓是否后台运行。
-
到镜像监视器查看添加的结果。被添加的数据库状态这时候应该是"一般"(Normal) 。
-
到其他镜像成员的镜像监视器查看, 您会看到主机来的通知引发的提醒:
- 在备机检查自己的数据库状态。如果没有DEMO或者USER数据库,那么创建它们,创建时下拉框”是否镜像?”选择否或者NO。之后在本地数据库列表中它们应该是这样,注意没有在镜像里。
-
在Primary做数据库的在线备份, 用于后面步骤里到其他成员上去做数据库恢复。
以下过程仅供参考:
# 在主成员备份,并发送给备份成员serverb
%SYS>do ^BACKUP
1) Backup
2) Restore ALL
3) Restore Selected or Renamed Directories
4) Edit/Display List of Directories for Backups
5) Abort Backup
6) Display Backup volume information
7) Monitor progress of backup or restore
Option? 1
*** The time is: 2022-09-17 15:27:48 ***
InterSystems IRIS Backup Utility
--------------------------
What kind of backup:
1. Full backup of all in-use blocks
2. Incremental since last backup
3. Cumulative incremental since last full backup
4. Exit the backup program
1 => 1
Specify output device (type STOP to exit)
Device: /isc/FullDBList_user.cbk => /isc/setmirror.cbk
Backing up to device: /isc/setmirror.cbk
Description:
Backing up the following directories:
/isc/data/demo/
/isc/iris/mgr/user/
Start the Backup (y/n)? => y
Journal file switched to:
/isc/jrnpri/MIRROR-AUGEST-20220917.011
Starting backup pass 1
Backing up /isc/data/demo/ at 09/17/2022 15:28:26
Copied 82 blocks in 0.004 seconds
Finished this pass of copying /isc/data/demo/
Backing up /isc/iris/mgr/user/ at 09/17/2022 15:28:28
Copied 908 blocks in 0.475 seconds
Finished this pass of copying /isc/iris/mgr/user/
Backup pass 1 complete at 09/17/2022 15:28:29
Starting backup pass 2
Backing up /isc/data/demo/ at 09/17/2022 15:28:31
Copied 2 blocks in 0.000 seconds
Finished this pass of copying /isc/data/demo/
Backing up /isc/iris/mgr/user/ at 09/17/2022 15:28:33
Copied 2 blocks in 0.000 seconds
Finished this pass of copying /isc/iris/mgr/user/
Backup pass 2 complete at 09/17/2022 15:28:33
Starting backup pass 3
Journal file '/isc/jrnpri/MIRROR-AUGEST-20220917.010' and the subsequent ones are required for recovery purpose if the backup were to be restored
Journal marker set at
offset 197572 of /isc/jrnpri/MIRROR-AUGEST-20220917.011
- This is the last pass - Suspending write daemon
Backing up /isc/data/demo/ at 09/17/2022 15:28:35
Copied 2 blocks in 0.000 seconds
Finished this pass of copying /isc/data/demo/
Backing up /isc/iris/mgr/user/ at 09/17/2022 15:28:35
Copied 2 blocks in 0.001 seconds
Finished this pass of copying /isc/iris/mgr/user/
Backup pass 3 complete at 09/17/2022 15:28:35
***FINISHED BACKUP***
Global references are enabled.
Backup complete.
1) Backup
2) Restore ALL
3) Restore Selected or Renamed Directories
4) Edit/Display List of Directories for Backups
5) Abort Backup
6) Display Backup volume information
7) Monitor progress of backup or restore
Option?
%SYS>!scp /isc/setmirror.cbk root@172.16.58.102:/isc
Enter passphrase for key '/root/.ssh/id_rsa':
root@172.16.58.102's password:
setmirror.cbk 100% 8448KB 49.4MB/s 00:00
%SYS>
-
在其他成员上恢复数据库,这里分两种情况:
- 其他成员上没有这个数据库: 比如我的serverb没有DEMO数据库,要做的是:创建一个DEMO数据库,使用和servera一样的设置,除了在下拉框“镜像数据库?“,回答”NO“
- 其他成员上有这个库,比如备机serverb里有User, 不用管它,下面我们就可以直接把它覆盖掉。
请参考下面的数据库恢复过程。 提醒一点:不要使用第一个选项“All Directories", 该选项不能用其他机器的备份文件恢复本机。
# 在Backup成员serverb上执行,恢复用源文件拷贝自servera
%SYS>do ^DBREST
Cache DBREST Utility
Restore database directories from a backup archive
Restore: 1. All directories
2. Selected and/or renamed directories
3. Display backup volume information
4. Exit the restore program
1 => 2
Do you want to set switch 10 so that other processes will be
prevented from running during the restore? Yes =>
Specify input file for volume 1 of backup 1
(Type STOP to exit)
Device: /isc/setmirror.cbk
This backup volume was created by:
IRIS for UNIX (Red Hat Enterprise Linux 7 for x86-64) 2022.1
The volume label contains:
Volume number 1
Volume backup SEP 17 2022 03:28PM Full
Previous backup SEP 16 2022 09:11AM Full
Last FULL backup SEP 16 2022 09:11AM
Description
Buffer Count 0
Mirror name AUGEST
Failover Member SERVERA/IRIS
Is this the backup you want to start restoring? Yes =>
This backup was made on the other mirror member.
Limit restore to mirrored databases? yes
For each database included in the backup file, you can:
-- press RETURN to restore it to its original directory;
-- type X, then press RETURN to skip it and not restore it at all.
-- type a different directory name. It will be restored to the directory
you specify. (If you specify a directory that already contains a
database, the data it contains will be lost).
/isc/data/demo/ (:mirror:AUGEST:DEMO) =>
/isc/iris/mgr/user/ (:mirror:AUGEST:USER) =>
Do you want to change this list of directories? No =>
Restore will overwrite the data in the old database. Confirm Restore? No => Yes
***Restoring /isc/data/demo/ at 15:47:09
82 blocks restored in 0.0 seconds for this pass, 82 total restored.
Expanding /isc/iris/mgr/user/ ...
Expanding /isc/iris/mgr/user/ from 1 MB to 654 MB
***Restoring /isc/iris/mgr/user/ at 15:47:12
908 blocks restored in 0.0 seconds for this pass, 908 total restored.
***Restoring /isc/data/demo/ at 15:47:12
2 blocks restored in 0.0 seconds for this pass, 84 total restored.
***Restoring /isc/iris/mgr/user/ at 15:47:12
2 blocks restored in 0.0 seconds for this pass, 910 total restored.
***Restoring /isc/data/demo/ at 15:47:12
2 blocks restored in 0.0 seconds for this pass, 86 total restored.
***Restoring /isc/iris/mgr/user/ at 15:47:12
2 blocks restored in 0.0 seconds for this pass, 912 total restored.
Specify input file for volume 1 of backup following SEP 17 2022 03:28PM
(Type STOP to exit)
Device:
Do you have any more backups to restore? Yes => no
Mounting /isc/data/demo/ which is a mirrored DB
/isc/data/demo/ ... (Mounted)
Mounting /isc/iris/mgr/user/ which is a mirrored DB
/isc/iris/mgr/user/ ... (Mounted)
Journal records for mirrored DBs were restored successfully.
%SYS>
- 检查数据库列表中的状态,注意它们已经成了AUGEST的镜像数据库了, 而且它们是只读模式。
- 在serverb上查看镜像监视器,确认它们的状态是Dejournaling
后面您可以像上面提到的,在主机上操作数据, 确认数据修改同步给了备机。到此这部分工作才算结束。
如果只有外部备份文件:
按照文档上的说法,如果用外部备份在非主成员恢复,恢复后需要在镜像监视器的”镜像数据库列表里“点击"ACtiviate", 直到看到状态为Caaught up为至。请参考文档,我不是很清楚细节。
其他的镜像操作
这里我说说怎么删除镜像, 以及其他的一些常用操作的要点, 比如什么时候使用“SET NO FAILOVER”等等。
TO BE CONTINUED...