Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - 数据库管理 » 维护数据库 » SQL Anywhere 高可用性

 

教程:使用多个数据库共享一个仲裁服务器的数据库镜像

在此配置中,主服务器和镜像服务器每个服务器上都有参与镜像系统的三个单独的数据库。所有三个镜像系统都与同一个仲裁服务器通信。每个镜像系统均使用使用 -sn 选项指定的唯一的替代服务器名。使用这种类型的配置,主服务器、镜像服务器和仲裁服务器全部可以在单独的计算机上运行。

图示显示镜像系统。

如果主服务器变为不可用,则出现角色切换,镜像服务器取得数据库所有权。镜像服务器变为主服务器。客户端必须重新建立与主服务器的连接。重新建立与主服务器的连接时只需指定替代服务器名。此配置还能够防止单个数据库出现故障。如果在主服务器上运行的数据库变为不可用,则出现角色切换,镜像服务器取得出现故障的数据库的所有权。镜像服务器只变为此数据库的主服务器。客户端必须使用替代服务器名重新建立与此数据库的主服务器的连接。

♦  设置三个数据库和一个仲裁服务器的镜像系统
  1. 创建以下目录:

    • c:\server1
    • c:\server2
    • c:\arbiter
  2. c:\server1 目录运行以下命令:

    dbinit one.db
    dbinit two.db
    dbinit three.db
  3. 通过运行以下命令,为每个数据库创建一个事务日志:

    dbping -d -c "UID=DBA;PWD=sql;DBF=c:\server1\one.db"
    dbping -d -c "UID=DBA;PWD=sql;DBF=c:\server1\two.db"
    dbping -d -c "UID=DBA;PWD=sql;DBF=c:\server1\three.db"
  4. 将数据库从 c:\server1 目录复制到 c:\server2 目录。

  5. 启动仲裁服务器:

    dbsrv11 
    -x tcpip(port=2640) 
    -n arbiter 
    -xa "AUTH=abc,def,ghi;DBN=one,two,three" 
    -xf c:\arbiter\arbiterstate.txt 
    -su sql
  6. 启动 server1 上的数据库:

    dbsrv11 
    -n server1 
    -x tcpip(PORT=2638) 
    -xf c:\server1\server1state.txt 
    -su sql 
    c:\server1\one.db 
    -sn mirrortutorial_one 
    -xp "partner=(ENG=server2;LINKS=tcpip(PORT=2639;TIMEOUT=1));
    auth=abc;arbiter=(ENG=arbiter;LINKS=tcpip(PORT=2640;TIMEOUT=1));
    mode=sync" 
    c:\server1\two.db 
    -sn mirrortutorial_two 
    -xp "partner=(ENG=server2;LINKS=tcpip(PORT=2639;TIMEOUT=1));
    auth=def;arbiter=(ENG=arbiter;LINKS=tcpip(PORT=2640;TIMEOUT=1));
    mode=sync" 
    c:\server1\three.db 
    -sn mirrortutorial_three 
    -xp "partner=(ENG=server2;LINKS=tcpip(PORT=2639;TIMEOUT=1));
    auth=ghi;arbiter=(ENG=arbiter;LINKS=tcpip(PORT=2640;TIMEOUT=1));
    mode=sync"
  7. 启动 server2 上的数据库:

    dbsrv11 
    -n server2 
    -x tcpip(PORT=2639) 
    -xf c:\server2\server2state.txt 
    -su sql 
    c:\server2\one.db 
    -sn mirrortutorial_one 
    -xp "partner=(ENG=server1;LINKS=tcpip(PORT=2638;TIMEOUT=1));
    auth=abc;arbiter=(ENG=arbiter;LINKS=tcpip(PORT=2640;TIMEOUT=1));
    mode=sync" 
    c:\server2\two.db 
    -sn mirrortutorial_two 
    -xp "partner=(ENG=server1;LINKS=tcpip(PORT=2638;TIMEOUT=1));
    auth=def;arbiter=(ENG=arbiter;LINKS=tcpip(PORT=2640;TIMEOUT=1));
    mode=sync" 
    c:\server2\three.db 
    -sn mirrortutorial_three 
    -xp "partner=(ENG=server1;LINKS=tcpip(PORT=2638;TIMEOUT=1));
    auth=ghi;arbiter=(ENG=arbiter;LINKS=tcpip(PORT=2640;TIMEOUT=1));
    mode=sync"

    启动 server2 后,server1 数据库服务器消息窗口显示 server1 是数据库一、二和三的镜像系统的主服务器。这些消息还指出一、二和三(合作伙伴)的镜像数据库连接到 server1。

    仲裁消息显示 server1 和 server2 均已连接。

  8. 运行以下命令启动 Interactive SQL 并连接到主服务器上的数据库一:

    dbisql -c "UID=DBA;PWD=sql;ENG=mirrortutorial_one;LINKS=TCPIP"
  9. 通过执行以下语句将示例数据添加到 SQL Anywhere 示例数据库:

    CREATE TABLE test (col1 INTEGER, col2 CHAR(32));
    INSERT INTO test VALUES(1, 'Hello from server1');
    COMMIT;
  10. 通过执行以下语句确定连接到的是哪个数据库服务器:

    SELECT PROPERTY( 'ServerName' );

    将出现主服务器的名称。

  11. 与 Interactive SQL 断开连接。

  12. 启动故障转移。要实现此目的,可以通过以下方式之一停止主服务器:

    • 在数据库服务器消息窗口中单击 [关闭]。

    • 使用 [Windows 任务管理器] 结束其任务。

    • 发出以下命令:

      dbstop -y -c "UID=DBA;PWD=sql;ENG=server1"

    如果出现警告消息,指出该数据库服务器仍存在一个连接,请单击 [是] 将其关闭。

    仲裁数据库服务器消息窗口将显示一条消息,指出主服务器已断开连接。

    仲裁数据库服务器消息窗口显示 server1 已断开连接。

    server2 数据库服务器消息窗口将显示一条消息,指出该服务器是新的主服务器:

    server2 数据库服务器消息窗口。
  13. 通过运行以下命令重新启动 Interactive SQL:

    dbisql -c "UID=DBA;PWD=sql;ENG=mirrortutorial_one;LINKS=tcpip"
  14. 执行以下语句以验证您当前是否已连接到镜像服务器:

    SELECT PROPERTY ( 'ServerName' );
  15. 执行以下语句以验证是否已将所有事务均镜像到镜像服务器:

    SELECT * FROM test;
  16. 与 Interactive SQL 断开连接,然后分别在 arbiter 和 server2 数据库服务器的数据库服务器消息窗口中单击 [关闭]。