SYBASE ASE代理表的应用

来源:互联网 发布:为什么要用react.js 编辑:程序博客网 时间:2024/06/18 05:37

SYBASE ASE代理表的应用

问题背景

  • 在解决数字法院现场问题时发现做读写分离的省份,写库和读库经常发生库结构不一致情况,比如读库字段缺失、索引缺失、字段顺序不一致,失会导致RS队列堆积甚至复制失败,如何检查生产环境的读写库结构一致性呢?
  • 公司在大力推行git-flow分布式开发模式,开发任务划分更细化,分支团队更多,每个团队维护使用的数据库也更多,怎么保证和检测代码合并后数据库的一致性呢?

解决问题

整体思路:

  • 通过SYBASE 组件集成服务(CIS)提供的代理表功能,访问远程服务器的数据库对象。将远程数据库的系统表和业务库的配置表代码表信息收集到本地服务器做库结构和数据一致性检查分析。

    • 以数字法院为例:

第一步:配置远程数据库连接

--NP_1210_6000为本地数据库--NP_1211_6000为远端数据库--sa登陆NP_1210_6000--打开cis配置use mastergosp_configure 'enable cis',1gosp_configure "cis rpc handling", 1gosp_configure "max cis remote connections", 20 go--在双方服务器interfaces中添加对方服务器信息--将本地服务名添加为localsp_addserver NP_1210_6000,localgo--重启服务器检查cis和服务名是否生效--添加远程服务器信息sp_addserver NP_1211_6000, ASEnterprise,NP_1211_6000go--添加远程登陆信息sp_addremotelogin NP_1211_6000, sa, sagosp_remoteoption NP_1211_6000, sa, sa, trusted, truego

第二步:创建PROXY库收集远程数据库信息

--创建PROXY库use mastergodisk init name='DEV_PROXY_DAT01',physname='/home/sybase/sybasedata/DEV_PROXY_DATA01.dat',size = '5G'godisk init name='DEV_PROXY_LOG01',physname='/home/sybase/sybasedata/DEV_PROXY_LOG01.dat',size = '1G'gocreate database PROXY on DEV_PROXY_DAT01='5G'log on DEV_PROXY_LOG01 = '1G'go--设置PROXY数据库属性等操作省略...--创建远程代理表use PROXYgocreate proxy_table pri_ywst_sysobjects  at "NP_1211_6000.YWST.dbo.sysobjects"gocreate proxy_table pri_ywst_syscolumns  at "NP_1211_6000.YWST.dbo.syscolumns"gocreate proxy_table pri_jcsz_sysobjects  at "NP_1211_6000.JCSZ.dbo.sysobjects"gocreate proxy_table pri_jcsz_syscolumns  at "NP_1211_6000.JCSZ.dbo.syscolumns"gocreate proxy_table pri_db_aty_sysobjects  at "NP_1211_6000.DB_ATY.dbo.sysobjects"gocreate 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)goinsert into T_TABLE_COLSselect '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 allselect '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 allselect '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 allselect '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 allselect '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 allselect '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 PROXYgo--分析字段缺失   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等,通过远程代理我们可以做很多对开发管理和运维管理有帮助的工作!