2008年7月19日星期六

Sybase 数据库复制

随着网络和通讯日新月异的发展,在银行、邮电、学校、企业已经大量地使用各种数据库系统来管理信息和数据,很多在线服务要求这些信息和数据永远都不中断服务的前提下,数据库系统的实时性、可靠性和高度可维护性成为越来越迫切的需要。而在线热备份技术(Online Replication Server)正是为实现永不中断服务的需求的一种比较成功的数据库解决方案。本文以UNIX Sun Solaris系统下的Sybase数据库基于一般表级复制和Warming Standing by方式的在线热备份为例,从热备份的概念原理、实现步骤、运行维护等三个方面介绍SYBASE Replication Server(复制服务器)。

  第I部分:Sybase数据库Replication Server的概念与原理

  一、 数据分布与复制:

  1、在线系统在出于安全性的考虑,对非常重要的数据库的数据和信息需要保存在不同的物理设备上,而且最好放置在不同的地方,以防止比较严重的物理损害(比如自然火灾之类)造成的物理损坏而引起数据丢失,这样需要通过网络在异地不同物理设备的多个数据服务器之间异步地复制数据,以保证分布数据的一致性和完整性;

  2、为了使每个Client前端对数据库数据信息的存取和查询都能够高效快速地完成,最好的情况是能够操作区域网内(LAN)的数据库,而在广域网(WAN)中要求与之数据一致的数据库通过数据复制的方式来实现。这样每个区域网都通过Replication Server与中心数据库相连,即实现了数据分布和复制。

  3、SYBASE数据库的分布处理技术:

  (1)、两阶段提交(同步事务):

  最紧密地保持数据的一致性。

  事务的速度将受限域最慢的服务器。

  整个系统任何一部分有问题都会使事务不成功。

  网络拓扑的变化需要修改应用

  (2)、松散一致性(异步事务):

  SYBASE的复制机制。

  表级卸出和装入(bcp in/out)。

  事务的log下载,传输,上载(dump,transfer,load)。

  对修改的记录做标记,定时传输。

  二、 复制服务器概念:

  复制服务器,就是一种通过网络在多个数据库之间实现数据复制,以保证数据的一致性和完整性。它可以实现各个Clients客户端用户都操作本地区域网的数据,然后通过复制服务器复制到中心数据库,也可以保证一个数据库出现物理损坏的情况下,能够及时地起用备份服务器而维持不中断的数据库信息服务。

  三、采用复制服务器的好处:

  1、改进整个系统性能:

  (1)、在区域网(LAN)传输数据比在广域网(WAN)快。

  (2)、避免了随着WAN上用户数的增加使得响应时间会明显增加从而影响应用的问题。

  (3)、由于决策支持系统-DSS的数据存于本地数据库,减少了数据库的锁碰撞和冲突,减少死锁的发生率。

  2、提高了数据的可用性

  (1)、当远程数据库发生故障,应用可以启动本地复制拷贝

  (2)、当WAN发生问题时,用户可以使用本地的数据库继续工作

  (3)、当本地发生故障时,应用可以连接到另一个有复制数据的节点继续工作

  3、数据库复制需要传输大量的数据,所以在占用网络带宽、传输的数据的可靠性和可维护性方面存在比较明显的缺陷。

  四、SYBASE数据库复制:

  1、 基本原理:

  用户事务被提交给主点数据库,事务被记入LOG,LOG被读出并按事务一级传给复制服务器,复制服务器完成接收、判断、迁移、组装和发送,事务发送给复制点服务器,复制点服务器完成本数据库的相同操作。

  2、 组成结构:

  复制服务器系统是由Dataserver、RS、LTM和网络等组成的集成综合系统,主要包括:

  (1)、网络:完成数据复制和传输的必须的物理连接线路和相关的硬件设施。

  (2)、SQL Server作为主点数据源

  Log可以支持LTM所需的第二个Truncation point

  对于已定义成可复制表的update操作将采用delete+insert方式

  Log可以记录被复制的存储过程,Database Dump,Transaction log Dump

  (3)、复制服务器RS

  记录复制和约定信息

  接收数据事务并传止约定的数据库和其它复制服务器

  (4)、LOG传输管理(LTM)。

  (5)、复制服务器系统数据库(RSSD)

  RSSD所包含的信息有:复制定义、约定定义、功能函数和功能函数定义、路由信息

  RSSD为一个SQL Server上的数据库,可以在主SQL Server上,也可在复制SQL Server上

  (6)、稳定队列

  存储主服务器已经完成但还没有复制到复制服务器的中间复制信息

  (7)、SQL Server或者其它数据源作为复制点数据源

  3、 分类

  根据复制实现方式分:

  (1)、一般复制环境(即表级复制):

  指将定义复制的表复制到相关的复制服务器,对没有定义复制的表不做复制,所以可以实现重要的表和易复制的表复制,好处是节省带宽和相关的硬盘空间。

  (2)、Warm Standby

  主要定义整个数据库进行定时热备份,当主点数据库损坏以后,Clients应用的转移需要一定时间。在正常运行是两个数据库的一致性由复制服务器来保证。主要好处是实现容易,而且以整个数据库的方式实现可以满足相应的Clients端需求,但需要比较复杂的维护和较大的硬盘空间。

  (3)、Hot Standby

  主要对整个数据库进行实时热备份,当主点数据库损坏后,Clients的应用转移能够马上转移到复制服务器。好处是能够保证数据库的高度实时性,但缺点是需要有高性能的线路质量、大量的维护工作、而且可实现性较差,容易出现问题使复制不成功。所以目前广泛采用Warm Standby方式和一般表级复制的方式来实现,很少用及Hot Standby方式。

  根据复制实现种类分:

  (1)、单向复制:一个主点,一个或若干复制点,一个RS

  (2)、双向复制:两个DB均为主点,两个RS,可分两种情况

  两个DB中的表分别为主点表,属于双向中的单向

  - 两个DB中的表全为主点表,不保证一致性
  
第II部分: SYBASE Replication 的安装配置:

  一、 用sybload安装产品;$SYBASE/rs_init配置Replication Server

  若rs_init起不来:

  # cd /usr/shlib

  # ln -s ./libdnet_stub.so libdnet.so

  In user environment, setenv _RLD_ARGS "-ignore_version libdnet_stub.so"

  二、 复制服务器安装范例:一般复制环境

  1:安装SQL Server和创建数据库,为一般的安装SYBASE数据库和创建数据库步骤,参考《SYBASE 数据库基础》部分:

  主结点:

  SQL Server Name: SQL1

  Database Name: DB1

  复制结点:

  SQL Server Name: SQL2

  Database Name: DB2

  2:安装复制服务器,RS Server:

  以sybase用户身份,在~sybase/install目录,执行rs_init:

  Replication Server Name: REP

  ID Server: yes

  RSSD位置: SQL Server Name: SQL1

  Database Name: RSSD

  Need LTM: no

  Stable queue: Physical path: /data1/sybase/dbfile/rs_queue1.dat

  Logical Name: queue1

  3:Add The First Database to Replication System

  使用:rs_init;

  Replication Server Name: REP

  Replication SA User: sa (Password is null unless you changed)

  SQL Server Name: SQL1

  Database Name: DB1

  Need LTM: yes (Primary Database -yes, Replication Database - no)

  LTM Name:DB1_LTM

  4:Add The Second Database to Replication System

  使用:rs_init;

  Replication Server Name: REP

  Replication SA User: sa (Password is null unless you changed)

  SQL Server Name: SQL2

  Database Name: DB2

  Need LTM: yes

  LTM Name:DB2_LTM

  5:Checking Whether All Server Is Running normally.

  SQL Server: SQL1 and SQL2

  Replication Server: REP

  LTM for DB1: DB1_LTM

  LTM for DB2: DB2_LTM

  使用 isql -Usa -SREP

  1 >admin who_is_down

  2 >go

  The result should be empty.

  6:Create Table

  isql -Usa -SSQL1

  >use DB1

  >go

  >create table tab1 (a int, b char(10), c int)

  >go

  >sp_setreplicate tab1, true

  >go

  >create table tab2 (a int, c char(10), e int)

  >go

  >insert into tab1 values(1, "AAAAA", 1)

  >go

  >grant all on tab2 to public

  >go

  >create table tab3(a int, b char(10), c int)

  >go

  >sp_setreplicate tab3, true

  >go

  >grant all on tab3 to public

  >go

  >insert into tab3 values(1, "CCCCC", 1)

  >go

  isql -Usa -SSQL2

  >use DB2

  >go

  >create table tab1 (a int, b char(10), c int)

  >go

  >grant all on tab1 to public

  >go

  >create table tab2 (a int, b char(10), c char(10), d int, e int)

  >go

  >insert into tab2 values(1, "AAAAA","BBBBB", 1, 1)

  >go

  > sp_setreplicate tab2, true

  >go

  >create table tab3(a int, b char(10), c int)

  >go

  >sp_setreplicate tab3, true

  >go

  >grant all on tab3 to public

  >go

  >insert into tab3 values(10000, "DDDDD", 1)

  >go

  注释:Now, We create three table tab1, tab2, tab3 in two database, SQL1.DB1, SQL2.DB2.We show three representative examples:

  Relicate data from SQL1.DB1.tab1 to SQL2.DB2.tab1;

  Replicate partial columns data from SQL2.DB2.tab2 to SQL1.DB1.tab2;

  Replicate data only a<10000 from SQL1.DB1.tab3 to SQL2.DB2.tab3, and replicate data only a>=10000 from SQL2.DB2.tab3 to SQL1.DB1.tab3.

  The first example help you testing whether or not replication succeed. The second show you that replication server can hidirection replicate data between two databases. The third show you that replication server can hidirection replicate data between two tables, this require data divide into two part, the first part from A to B, and the second part from B to A.

  7:Create Replication Definition

  Example 1:

  isql -Usa -SREP

  >create replication definition rep_tab1 with primary at SQL1.DB1

  >with all table named 'tab1' (a int, b char(10), c int) primary key(a)

  >go

  >create subscription sub_tab1 for rep_tab1 with replicate at SQL2.DB2

  >go

  isql -Usa -SSQL2

  1>use DB2

  2>go

  1>select * from tab1

  2>go

  You should see there are a row (1, "AAAAA", 1) in the table tab1. If you can't see, you should wait a moment and retry.

  You should sure that the password of user sa of replication server REP has the same as the password of sa of SQL Server SQL1. If not, you can execute the following command:

  isql -Usa -SREP

  1>alter user sa set password password

  2>go

  And, you can execute the following command to check the replication status:

  Isql -Usa -SREP

  1> check subscription sub_tab1 for rep_tab1 with replicate at SQL2.DB2

  2> go

  If the result contains two VALID, you can execute the following command:

  isql -Usa -SSQL1

  1>use DB1

  2>go

  1>insert into tab1 values(2, "AAA01", 2)

  2>go

  isql -Usa -SSQL2

  1>use DB2

  2>go

  1>select * from tab2

  2>go

  The results should contain two rows, and now replication is normal. You may do other testing to check.

  Example 2:

  isql -Usa -SREP

  1>create replication definition rep_tab2 with primary at SQL2.DB2

  2> with all tables named 'tab2'(a int, c char(10), e int) primary key (a )

  3>go

  1>create subscription sub_tab2 for rep_tab2 with replicate at SQL1.DB1

  2>go

  You can use the previous method to check.

  isql -Usa -SSQL2

  1>use DB2

  2>go

  1>insert into tab2 values(2, "aaaaa", "bbbbb", 2, 2)

  2>go

  isql -Usa -SSQL1

  1>use DB1

  2>go

  1>select * from tab2

  2>go

  Example 3:

  isql -Usa -SREP

  1>create replication definition SQL1_tab3 with primary at SQL1.DB1

  2>with all tables named 'tab3'(a int, b char(10), c int)

  3>primary key (a) searchable columns (a)

  4>go

  1>create subscription sub_SQL1_tab3 for SQL1_tab3

  2>with replicate at SQL2.DB2 where a<10000

  3>go

  1>create replication definition SQL2_tab3 with primary at SQL2.DB2

  2>with all tables named 'tab3'(a int, b char(10), c int)

  3>primary key (a) searchable columns(a)

  4>go

  1>create subscription sub_SQL2_tab3 for SQL2_tab3

  2>with replicate at SQL1.DB1 where a>=10000

  3>go

  Using the same method, you can check whether or not hidirection replication is successful.

  isql -Usa -SSQL1

  1>use DB1

  2>go

  1>insert into tab3 values(100, "QQQQQ", 100)

  2>go

  isql -Usa -SSQL2

  1>use DB2

  2>go

  1>select * from tab3

  2>go

  1>insert into tab3 values(10002, "WWWWW", 11)

  2>go

  isql -Usa -SSQL1

  1>use DB1

  2>go

  1>select * from tab3

  2>go

  三、 复制服务器安装范例:Warm Standby应用

  1:Install SQL Server, Create Database:

  主结点:

  SQL Server Name: SQL1

  Database Name: DB3

  复制结点:

  SQL Server Name: SQL2

  Database Name: DB3

  2:Install Replication Server

  使用rs_init:

  Replication Server Name: REP

  ID Server: yes

  RSSD位置: SQL Server Name: SQL1

  Database Name: RSSD

  Need LTM: no

  Stable queue: Physical path: /data1/sybase/rs_queue1.dat

  Logical Name: queue1

  3:Creating the Logical Connection

  isql -Usa -SREP

  1>create logical connection to demo_lds.demo_db

  2>go

  注:逻辑连接使用的Data Server和Database名应不同于Active Database;但如果database已存在于复制环境,则逻辑连接使用的Data Server和Database名必须与Active Database的一样。

  4:Adding the Active Database to the replication System

  使用:rs_init;

  Replication Server Name: REP

  Replication SA User: sa (Password is null unless you changed)

  SQL Server Name: SQL1

  Database Name: DB3

  Need LTM: yes (Primary Database -yes, Replication Database - no)

  LTM Name:SQL1_DB3_LTM

  Is This a Physical Connection for an Existing Logical Connection? yes

  Is This an Active connection or standby connection? active

  Logical DS Name: demo_lds

  Logical DB Name: demo_db

  5:Create Table in the Active Database & Standby Database

  isql -Usa -SSQL1

  1>use DB3

  2>go

  1>create table tab1(a int, b char(10))

  2>go

  1>quit

  isql -Usa -SSQL2

  1>use DB3

  2>go

  1>create table tab1(a int, b char(10))

  2>go

  1>quit

  6:Enabling replication for Objects in the Active Database

  isql -Usa -SSQL1

  1>use DB3

  2>go

  1>sp_setreptable tab1, true

  2>go

  7:Adding the Standby Database Maintenance User

  isql -Usa -SSQL2

  1>sp_addlogin SQL2_DB3_maint,SQL2_DB3_maint_ps,DB3

  2>go

  1>quit

  isql -Usa -SSQL1

  1>sp_addlogin SQL2_DB3_maint,SQL2_DB3_maint_ps,DB3

  2>go

  1>use DB3

  2>go

  1>sp_adduser SQL2_DB3_maint

  2>go

  1>quit

  注:SQL1和SQL2中的所有login ID(即suid)必须一致,这可以通过用相同的顺序建用户来实现;也可以用调整系统表syslogins和sysloginroles来实现。

  8:Adding the Standby Database to Replication System

  isql -Usa -SREP

  1>suspend connection to SQL1.DB3 with nowait

  2>go

  使用:rs_init;

  Replication Server Name: REP

  Replication SA User: sa (Password is null unless you changed)

  SQL Server Name: SQL2

  Database Name: DB3

  Need LTM: yes

  LTM Name:SQL2_DB3_LTM

  Is This an Active Connection or Standby Connection? Standby

  Logical DS name: demo_lds

  Logical DB name: demo_db

  Active DS name: SQL1

  Active DB name: DB3

  Active DB SA user: sa

  Active DB SA Password:

  Initialize Standby Using Dump and Load: yes

  Use Dump Marker to Start Replicating to Standby: no

  9:同步两个数据库的数据

  isql -Usa -SREP

  1>wait for create standby for demo_lds.demo_db

  2>go

  1>admin logical_status, demo_lds,demo_db

  2>go

  1>quit

  isql -Usa -SSQL1

  1>dump database DB3 to "/data1/sybase/db3_data.dat"

  2>go

  1>quit

  #rcp node1:/data1/sybase/db3_data.dat, /data1/sybase

  #chown sybase /data1/sybase/db3_data.dat

  You can also use ftp with the sybase user from node1:/data1/sybase/dbfile/db3_data.dat to node2 with the same location.

  isql -Usa -SSQL2

  1>load database DB3 from "/data1/sybase/db3_data.dat"

  2>go

  1>online database DB3

  2>go

  1>quit

  isql -Usa -SREP

  1>resume connection to SQL1.DB3

  2>go

  1>resume connection to SQL2.DB3

  2>go

  1>quit

  10:Enabling Replication for Objects in the Standby Database

  isql -Usa -SSQL1

  1>sp_setreptable tab1, true

  2>go

  11:Granting Permission to the Maintenance User

  isql -Usa -SSQL2

  1>use DB3

  2>go

  1>grant all on tab1 to SQL2_DB3_maint

  2>go

 第三部分:复制服务器的运行维护

  因为复制服务器是实时在线复制系统,同时又涉及到主结点和复制结点的两个运行数据库,而且往往数据库处理的数据和信息量也很大,而复制服务器本身又是一种比较复杂的技术,所以复制服务器需要专门的高级数据库管理员(DBA)经常地进行高水平和高质量的维护工作,下面仅介绍一些基本的维护和管理知识,对于复杂的维护知识和技术,请大家参考SYBASE数据库随机参考手册《Replication Server Administration Guide》、《Replication Server Commands Reference》。

  一、 数据库复制系统的启动和关闭步骤:

  1、数据库复制系统启动顺序:

  (1)在主点数据库DB1主机 /database/sybase/install目录下执行

  db1% startserver-f RUN_SYSBASE1 启动SYBASE1 SQL Server

  (2) 在复制点数据库DB2主机 /database/sybase/install目录下执行

  db2% startserver-f RUN_SYBASE2 启动SYBASE2 SQL Server

  (3) 在复制服务器RS主机 /database/sybase/install目录下执行

  db2% startserver-f RUN_RSCC 启动RSCC复制服务器

  (4) 在复制服务器RS主机 /database/sybase/install目录下执行

  db2% startserver-f RUN_SYSBASE1_aicntmng_ltm 启动主点数据库LOG传输管理进程

  (5) 检查

  % ps -ef 可看到以上全部进程

  % showserver 可看到SQL Server进程 如SYBASE1 SYBASE2

  (6) 备份服务器: 只用于数据库备份,即dump和load时才用到。 可用Showserver看到。启动命令为:

  db1% startserver -f RUN_BACKUP1

  db2% startserver -f RUN_BACKUP2

  2、数据库复制系统关闭顺序: (与启动顺序相反)

  (1)。db2% isql -Usa -SSYBASE1_aicntmng_ltm

  1> shutdown

  2> go 关闭LTM进程

  (2)。db2% isql -Usa -SRSCC

  1> shutdown

  2> go 关闭复制服务器

  (3)。Db2 % isql -Usa -SSYBASE2

  1> shutdown SYB_BACKUP

  2> go

  1> shutdown

  2> go 关闭复制点数据库SQL服务器

  (4)。db1% isql -Usa -SSYBASE1

  1> shutdown SYB_BACKUP

  2> go 关闭BACKUP服务器

  1> Shutdown

  2> go 关闭主点数据库SQL服务器

  二、 监视复制服务器系统运行状态

  1、在RSCC上监视,用admin who 看所有进程是否正常,主要选项down、suspent、active和awaiting;admin health看连接状态;admin logical_status看逻辑连接方向;admin disk_space看稳定对列及空间占用率

  db1% isql -Usa -SRSCC

  1> admin health

  2> go

  正常状态为:

  Mode Quiesce Status

  NORMAL TRUE HEALTHY

  其中Status一定要为HEALTHY,出现SUSPECT请检查:

  1> admin who_is_down

  2> go 可查到哪个内部线程被挂起,这时,检查RSCC. Log文件.

  1>admin logical_status

  2>go 可检查逻辑连接方向是否正常。

  1>admin disk_space

  2>go 检查已经使用的稳定队列的磁盘空间情况。

  2. 在UNIX下,监视复制服务系统的log文件

  db1% /database/sysbase/install/RSCC.log 复制服务器的LOG文件

  more RSCC.log 检查ERROR

  和/database/sysbase/install/SYBASE1_aicntmng_ltm.log LTM的LOG文件

  db1% more SYBASE1_aicntmng_ltm.log 检查ERROR

  四、常见故障现象与解决方法

  1、复制服务器系统是一个自动运行系统, admin who看到有进程suspend时会自动挂起内部线程, 并在一定时间后自动重试。所以一旦出现问题log增长很快,一分钟内就会多次报错。如:在复制记录时,若发现有相同记录,就会在RSCC. Log文件中报错,并多次尝试复制,log文件快速增长,且阻塞后面排队等待复制的记录。因此,需要人工干预,才能使复制继续进行。假如可以跳过相同的记录复制,留待以后处理,就可首先解网络故障,再执行以下命令。

  isql -Usa -RSCC

  1> resume connection to SYBASE2. aicntmng skip transaction

  2> go

  过一段时间后, 检查SYBASE2. aicutmng是否正常

  1> admin who_is_down

  2> go 或

  1> admin health

  2> go

  2、admin disk_space时队列长时间塞满(2小时以上),是由于 稳定对列空间不足,log塞满空间,稳定对列被塞死,原因是主点DB一次执行了大数据量事务或由于网络终断,复制点出问题,导致多次log在稳定对列中引起阻塞。

  解决:增加稳定对列。或停止复制连接,再重配RS,以清空对列。

  3、复制点CPU占用率一直在100%(时间长达24小时以上),稳定对列中有数据(在复制完成后,稳定对列是自动清空的)这一般是由于复制点资源被耗尽(log、mem、?)

  解决:可检查复制点机器资源,增加相应资源。重起RDS。

  4、主点DB删不掉log,稳定对列空间占满

  由于稳定对列塞死,无法从PDB log中读取log,而为保证一致性,未读入稳定对列的log就无法删除。

  解决:检查稳定对列为何塞死,解决相应问题。应急措施可增加稳定对列空间,删掉主点部分log使主点可继续工作,再解决RS系统上问题,如没空间可增加,先去掉复制:isql -Usa -SSYBASE1

  1> dbcc setturnc (ltm、ignore)

  2> go

  解决问题后需重新设置RS系统。

  【参考文献】

  1、《Replication Server Adminstration Guide》,SYBASE 11.03 随机手册。

  2、《Replication Server Commands Reference》,SYBASE 11.03随机手册。

  3、SYBASE公司相关的数据库复制资料。

  4、SYBASE公司数据库复制的实现培训内资料。

没有评论: