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

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

 

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

注意

如果本教程用于运行在不同计算机上的数据库服务器,连接字符串中对 localhost 的引用必须更改为实际的计算机名。

samples-dir\SQLAnywhere\DBMirror 中有一个将数据库镜像与向外扩展系统配合使用的示例。示例可在一台计算机或多台计算机上运行。

有关 samples-dir 位置的信息,请参见文件位置和安装设置

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

图示显示镜像系统。

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

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

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

    newdemo c:\server1\one.db
  3. 运行以下命令:

    newdemo c:\server1\two.db
  4. c:\server1 目录运行以下命令:

    newdemo c:\server1\three.db
  5. 启动名为 server1 的数据库服务器:

    dbsrv12 -n server1 -x tcpip(PORT=6871) -su sql
    c:\server1\one.db -xp on c:\server1\two.db -xp on c:\server1\three.db -xp on
  6. 从 Interactive SQL 连接到数据库一,并定义所需的镜像对象:

    dbisql -c "UID=DBA;PWD=sql;SERVER=server1;DBN=one"
    1. 将 server1 定义为数据库一的伙伴服务器:

      CREATE MIRROR SERVER server1
      AS PARTNER
      connection_string='SERVER=server1;host=localhost:6871'
      state_file='c:\server1\server1state.txt';
    2. 将数据库服务器 primary_one 定义为数据库一的逻辑主服务器:

      CREATE MIRROR SERVER primary_one
      AS PRIMARY
      connection_string='SERVER=primary_one;host=localhost:6871,localhost:6872';
    3. 将 server2 定义为数据库一的伙伴服务器:

      CREATE MIRROR SERVER server2
      AS PARTNER
      connection_string='SERVER=server2;host=localhost:6872'
      state_file='c:\server2\server2state.txt';
    4. 将数据库服务器 mirror_one 定义为数据库一的逻辑主服务器:

      CREATE MIRROR SERVER mirror_one
      AS MIRROR
      connection_string='SERVER=mirror_one;host=localhost:6871,localhost:6872';
    5. 定义仲裁服务器:

      CREATE MIRROR SERVER arbiter
      AS ARBITER
      connection_string='SERVER=arbiter;HOST=localhost:6870';
    6. 为数据库镜像系统设置镜像选项:

      SET MIRROR OPTION authentication_string='abc';
    7. 与 Interactive SQL 断开连接。

    8. c:\server2 目录中的数据库制作备份副本:

      dbbackup -c "UID=DBA;PWD=sql;SERVER=server1;DBN=one" c:\server2
  7. 从 Interactive SQL 连接到数据库二,并定义所需的镜像对象:

    dbisql -c "UID=DBA;PWD=sql;SERVER=server1;DBN=two"
    1. 将 server1 定义为数据库二的伙伴服务器:

      CREATE MIRROR SERVER server1
      AS PARTNER
      connection_string='SERVER=server1;host=localhost:6871'
      state_file='c:\server1\server1state.txt';
    2. 将数据库服务器 primary_two 定义为数据库二的逻辑主服务器:

      CREATE MIRROR SERVER primary_two
      AS PRIMARY
      connection_string='SERVER=primary_two;host=localhost:6871,localhost:6872';
    3. 将 server2 定义为数据库二的伙伴服务器:

      CREATE MIRROR SERVER server2
      AS PARTNER
      connection_string='SERVER=server2;host=localhost:6872'
      state_file='c:\server2\server2state.txt';
    4. 将数据库服务器 mirror_two 定义为数据库二的逻辑主服务器:

      CREATE MIRROR SERVER mirror_two
      AS MIRROR
      connection_string='SERVER=mirror_two;host=localhost:6871,localhost:6872';
    5. 定义仲裁服务器:

      CREATE MIRROR SERVER arbiter
      AS ARBITER
      connection_string='SERVER=arbiter;HOST=localhost:6870';
    6. 为数据库镜像系统设置镜像选项:

      SET MIRROR OPTION authentication_string='def';
    7. 与 Interactive SQL 断开连接。

    8. c:\server2 目录中的数据库制作备份副本:

      dbbackup -c "UID=DBA;PWD=sql;SERVER=server1;DBN=two" c:\server2
  8. 从 Interactive SQL 连接到数据库三,并定义所需的镜像对象:

    dbisql -c "UID=DBA;PWD=sql;SERVER=server1;DBN=three"
    1. 将 server1 定义为数据库三的伙伴服务器:

      CREATE MIRROR SERVER server1
      AS PARTNER
      connection_string='SERVER=server1;host=localhost:6871'
      state_file='c:\server1\server1state.txt';
    2. 将数据库服务器 primary_three 定义为数据库三的逻辑主服务器:

      CREATE MIRROR SERVER primary_three
      AS PRIMARY
      connection_string='SERVER=primary_three;host=localhost:6871,localhost:6872';
    3. 将 server2 定义为数据库三的伙伴服务器:

      CREATE MIRROR SERVER server2
      AS PARTNER
      connection_string='SERVER=server2;host=localhost:6872'
      state_file='c:\server2\server2state.txt';
    4. 将数据库服务器 mirror_three 定义为数据库三的逻辑主服务器:

      CREATE MIRROR SERVER mirror_three
      AS MIRROR
      connection_string='SERVER=mirror_three;host=localhost:6871,localhost:6872';
    5. 定义仲裁服务器:

      CREATE MIRROR SERVER arbiter
      AS ARBITER
      connection_string='SERVER=arbiter;HOST=localhost:6870';
    6. 为数据库镜像系统设置镜像选项:

      SET MIRROR OPTION authentication_string='ghi';
    7. 与 Interactive SQL 断开连接。

    8. c:\server2 目录中的数据库制作备份副本:

      dbbackup -c "UID=DBA;PWD=sql;SERVER=server1;DBN=three" c:\server2
  9. 启动名为 server2 的数据库服务器:

    dbsrv12 -n server2 -x tcpip(PORT=6872) 
    -su sql c:\server2\one.db -xp on c:\server2\two.db -xp on c:\server2\three.db -xp on
  10. 启动仲裁服务器。

    dbsrv12 
    -n arbiter
    -su sql
    -x tcpip(port=6870)
    -xf c:\arbiter\arbiterstate.txt
    -xa "AUTH=abc,def,ghi;DBN=one,two,three"

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

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

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

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

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

    SELECT PROPERTY( 'ServerName' );

    将出现主服务器的名称。

  14. 与 Interactive SQL 断开连接。

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

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

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

    • 发出以下命令:

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

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

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

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

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

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

    dbisql -c "UID=DBA;PWD=sql;Server=primary_one;LINKS=tcpip"
  17. 执行以下语句以验证您当前是否已连接到 server2:

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

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

  20. (可选)删除 c:\server1c:\server2c:\arbiter 目录。