SYBASE ASE代理表的应用
问题背景
- 在解决数字法院现场问题时发现做读写分离的省份,写库和读库经常发生库结构不一致情况,比如读库字段缺失、索引缺失、字段顺序不一致,失会导致RS队列堆积甚至复制失败,如何检查生产环境的读写库结构一致性呢?
- 公司在大力推行git-flow分布式开发模式,开发任务划分更细化,分支团队更多,每个团队维护使用的数据库也更多,怎么保证和检测代码合并后数据库的一致性呢?
解决问题
整体思路:
-
通过SYBASE 组件集成服务(CIS)提供的代理表功能,访问远程服务器的数据库对象。将远程数据库的系统表和业务库的配置表代码表信息收集到本地服务器做库结构和数据一致性检查分析。
-
以数字法院为例:
第一步:配置远程数据库连接
--NP_1210_6000为本地数据库
--NP_1211_6000为远端数据库
--sa登陆NP_1210_6000
--打开cis配置
use master
go
sp_configure 'enable cis',1
go
sp_configure "cis rpc handling", 1
go
sp_configure "max cis remote connections", 20
go
--在双方服务器interfaces中添加对方服务器信息
--将本地服务名添加为local
sp_addserver NP_1210_6000,local
go
--重启服务器检查cis和服务名是否生效
--添加远程服务器信息
sp_addserver NP_1211_6000, ASEnterprise,NP_1211_6000
go
--添加远程登陆信息
sp_addremotelogin NP_1211_6000, sa, sa
go
sp_remoteoption NP_1211_6000, sa, sa, trusted, true
go
第二步:创建PROXY库收集远程数据库信息
--创建PROXY库
use master
go
disk init
name='DEV_PROXY_DAT01',
physname='/home/sybase/sybasedata/DEV_PROXY_DATA01.dat',
size = '5G'
go
disk init
name='DEV_PROXY_LOG01',
physname='/home/sybase/sybasedata/DEV_PROXY_LOG01.dat',
size = '1G'
go
create database PROXY
on DEV_PROXY_DAT01='5G'
log on DEV_PROXY_LOG01 = '1G'
go
--设置PROXY数据库属性等操作省略...
--创建远程代理表
use PROXY
go
create proxy_table pri_ywst_sysobjects at "NP_1211_6000.YWST.dbo.sysobjects"
go
create proxy_table pri_ywst_syscolumns at "NP_1211_6000.YWST.dbo.syscolumns"
go
create proxy_table pri_jcsz_sysobjects at "NP_1211_6000.JCSZ.dbo.sysobjects"
go
create proxy_table pri_jcsz_syscolumns at "NP_1211_6000.JCSZ.dbo.syscolumns"
go
create proxy_table pri_db_aty_sysobjects at "NP_1211_6000.DB_ATY.dbo.sysobjects"
go
create proxy_table pri_db_aty_syscolumns at "NP_1211_6000.DB_ATY.dbo.syscolumns"
go
--收集远程库信息
create table T_TABLE_COLS (
C_SITE varchar(100) null,
C_DB VARCHAR(100) NULL,
C_TABLE VARCHAR(100) NULL,
C_COLNAME VARCHAR(100) NULL,
C_COLORDER INT NULL
)
go
insert into T_TABLE_COLS
select 'ST', 'YWST', obj.name, col.name, col.colid
from YWST..syscolumns col, YWST..sysobjects obj
where col.id = obj.id and obj.type = 'U'
union all
select 'ST', 'JCSZ', obj.name, col.name, col.colid
from JCSZ..syscolumns col, JCSZ..sysobjects obj
where col.id = obj.id and obj.type = 'U'
union all
select 'ST', 'DB_ATY', obj.name, col.name, col.colid
from DB_ATY..syscolumns col, DB_ATY..sysobjects obj
where col.id = obj.id and obj.type = 'U'
union all
select 'PR', 'YWST', obj.name, col.name, col.colid
from PROXY..pri_ywst_syscolumns col, PROXY..pri_ywst_sysobjects obj
where col.id = obj.id and obj.type = 'U'
union all
select 'PR', 'JCSZ', obj.name, col.name, col.colid
from PROXY..pri_jcsz_syscolumns col, PROXY..pri_jcsz_sysobjects obj
where col.id = obj.id and obj.type = 'U'
union all
select 'PR', 'DB_ATY', obj.name, col.name, col.colid
from PROXY..pri_db_aty_syscolumns col, PROXY..pri_db_aty_sysobjects obj
where col.id = obj.id and obj.type = 'U'
go
第三步:检查两个节点库结构和数据一致性。
--分析库结构一致性
use PROXY
go
--分析字段缺失
SELECT * FROM (
select p.C_SITE AS PR_SITE,
p.C_DB AS PR_DB,
p.C_TABLE AS PR_TABLE,
p.C_COLNAME AS PR_COLNAME,
s.C_SITE AS ST_SITE
from T_TABLE_COLS p
left join T_TABLE_COLS s on p.C_SITE = 'PR' and s.C_SITE = 'ST' AND p.C_DB = s.C_DB AND p.C_TABLE = s.C_TABLE and p.C_COLNAME = s.C_COLNAME
) t
where t.ST_SITE IS NULL
--分析字段一致性
select * from T_TABLE_COLS p ,T_TABLE_COLS s
where p.C_SITE = 'PR' and s.C_SITE = 'ST' AND p.C_DB = s.C_DB AND p.C_TABLE = s.C_TABLE and p.C_COLNAME = s.C_COLNAME
and p.C_COLORDER != s.C_COLORDER
--还可以做:
--分析索引的一致性
--分析表数据的一致性
--等等
总结
同理可以将配置表、单值代码表等做代理来检测数据的一致性,各大DBMS都有远程代理的功能如ORACLE的DBLINK、ABASE的FDW等,通过远程代理我们可以做很多对开发管理和运维管理有帮助的工作!