点击上方“IT那活儿”,关注后了解更多内容,不管IT什么活儿,干就完了!!!
问题背景
由于地市要上线新业务,但内存库负载较高,无法支撑新业务上线,对内存库进行拆库操作。
拆库割接步骤
老环境:ceshi11 ceshi21 主备 主机双实例(userinfo account)
路由库:ceshecbe19 ceshecbe29 主备 实例(cbedata)
新环境:ceshi12 ceshi22 主备 主机双实例(userinfo account)
1. 现网新环境清理(重启主机、检查服务IP、冻结HA服务,摧毁新环境TT库)。
2. 新环境TT库配置ini文件(新环境的连接串添加到ini文件中,在进行替换)。
将新环境连接串添加到sys.odbc.ini sys.ttconnect.ini 这两个文件中。
3. 老环境导出结构,新环境TT库导入对象结构(ttschema userinfo/account)
--老环境主库导出对象结构:
ceshi11(userinfo):ttschema userinfo > /logds/dump/ceshi11 _userinfo .sqlceshi11(account):ttschema userinfo > /logds/dump/ceshi11 _accout .sql
--将导出的对象结构传输到新环境:
scp ceshi11*.sql ceshi12:/logds/dump
新环境将导入前编辑sql文本将关于序列,asp关系的语句保留下来在将它们去除。
--序列等数据导入到新环境后需要建立,asp关系新环境根据老环境创建。剔除的表保持一致。
ttisql userinfo@/logds/dump/ceshi11 _userinfo .sql 进行导入ttisql account@/logds/dump/ceshi11 _accout .sql 进行导入user info手动加载内存ttadmin -rampolicy manual -noautoreload userinfottadmin -ramload userinfo
--建立asp关系:
create active standby pairUSERINFO on " CESHI12", USERINFO on " CESHI22"store USERINFO on "CESHI12"failthreshold 100store USERINFO on "CESHI22"failthreshold 100
--打开复制进程:
ttadmin -repstart userinfo
--进入数据库将CESHI12设置为主库:
ttisql userinfocall ttrepstateset(‘active’);
--检查是否为active状态。
call ttrepstateget;
--account手动加载内存:
ttadmin -rampolicy manual -noautoreload accountttadmin -ramload accountttstatus
--建立asp关系:
create active standby pairACCOUNT on " CESHI12", USERINFO on " CESHI22"store ACCOUNT on "CESHI12"failthreshold 100store ACCOUNT on "CESHI22"failthreshold 100
--打开复制进程:
ttadmin -repstart account
--进入数据库将CESHI12设置为主库:
ttisql accountcall ttrepstateset(‘active’);
--检查是否为active状态。
call ttrepstateget;
以上可以在割接前提前准备。
4. 老环境冻结ha服务
crm configure property maintenance-mode=true
5. 停应用,检查老环境连接数
--查询总的连接数:
ttstatus | grep conn
--查询哪些应用的连接数比较高:
ttstatus |grep Server |awk '{print$4}' | sort | uniq -c
--杀连接:
ttstatus | grep "Node:" | grep -v grep | awk '{print $2}' | xargs kill -9ttstatus | grep Process | grep -v grep | awk '{print $2}' | xargs kill -9ttstatus | grep Server | grep -v grep | awk '{print $2}' | xargs kill -9
@、检查主备事物同步状况:
ttisql -e "call ttrepsubscriberwait(,,,,-1);bye;" -connstr userinfottisql -e "call ttrepsubscriberwait(,,,,-1);bye;" -connstr accountttisql -e "call ttrepsubscriberwait(,,,,-1);bye;" -connstr cbedata
注: < 00 > --00(正常),01(异常)。
@、检查主备库数据一致性:
ttisql -e "vertical call ttbookmark;bye;" -connstr userinfottisql -e "vertical call ttbookmark;bye;" -connstr account
6. 停止主备复制进程并删除asp关系 新老环境都要停
ttisql -e "call ttrepstop; bye;" -connstr userinfottisql -e "call ttrepstop; bye;" -connstr accountttisql -e "call ttrepstop; bye;" -connstr cbedatattisql userinfodrop active standby pair;ttisql accountdrop active standby pair;ttisql cbedatadrop active standby pair;
7. 老环境导出数据
userinfottBulkCp -o -s "|" "dsn=userinfo" USERINFO.USER_CUST/logds/dump/ USERINFO.USER_CUST.unl > logds/dump/ USERINFO.USER_CUST.log &accountttBulkCp -o -s "|" "dsn=account" ACCOUNT. ACCT_CUST logds/dump/ ACCT_CUST.unl > /logds/dump/ ACCT_CUST.log &userinfoselect count(*) from USERINFO.USER_CUST;accountselect count(*) from ACCOUNT. ACCT_CUST;
导出数据通过日志和数据库查询结果做对比看是否一致。
8. 传输数据文件并导入数据
scp *.unl ceshi12:/logds/dump
--新环境给文件权限进行导入:
chown ttuser:ttusers USERINFO.USER_CUST.unlchown ttacct:ttusers ACCT_CUST.unl>>>userinfottBulkCp -i -xp 10000 -s "|" "dsn=userinfo" USERINFO.USER_CUST /logds/dump/ USERINFO.USER_CUST.unl > /logds/dump/ USERINFO.USER_CUST.log &>>>accountttBulkCp -i -xp 10000 -s "|" "dsn=account" ACCOUNT. ACCT_CUST /logds/dump/ ACCOUNT. ACCT_CUST.unl > /logds/dump/ ACCOUNT. ACCT_CUST.log &
--新环境导入数据通过日志和数据库查询结果做对比看是否一致。
userinfoselect count(*) from USERINFO.USER_CUST;accountselect count(*) from ACCOUNT. ACCT_CUST;
9. 创建序列
可以通过之前保留下来的序列直接创建,太多也可以放到一个sql文本中进数据库通过@命令插入。
10. 进行业务割接
11. 创建新老环境asp关系,起复制进程
Userinfo
--建立asp关系:
create active standby pairUSERINFO on " CESHI12", USERINFO on " CESHI22"store USERINFO on "CESHI12"failthreshold 100store USERINFO on "CESHI22"failthreshold 100ttisql userinfocall ttrepstart;call ttrepstateset('active');call ttrepstateget;ceshi11create active standby pairUSERINFO on " CESHI11", USERINFO on " CESHI21"store USERINFO on "CESHI11"failthreshold 100store USERINFO on "CESHI21"failthreshold 100ttisql userinfocall ttrepstart;call ttrepstateset('active');call ttrepstateget;account
--建立asp关系:
create active standby pairACCOUNT on " CESHI12", USERINFO on " CESHI22"store ACCOUNT on "CESHI12"failthreshold 100store ACCOUNT on "CESHI22"failthreshold 100ttisql accountcall ttrepstart;call ttrepstateset('active');call ttrepstateget;ceshi11create active standby pairACCOUNT on " CESHI11", USERINFO on " CESHI21"store ACCOUNT on "CESHI11"failthreshold 100store ACCOUNT on "CESHI21"failthreshold 100ttisql accountcall ttrepstart;call ttrepstateset('active');call ttrepstateget;cbedata
--建立asp关系:
Cbe19create active standby pairCBEDATA on " CESHI19", USERINFO on " CESHI29"store CBEDATA on "CESHI19"failthreshold 100store CBEDATA on "CESHI29"failthreshold 100ttisql cbedatacall ttrepstart;call ttrepstateset('active');call ttrepstateget;
--新环境检查对象结构:
ttschema userinfottschema account
12. 新老环境主库收集统计信息
userinfo
--编写一个脚本收集统计信息。
--创建一个~/OptEstimateStats目录:
vi update.sh#!/usr/bin/ksh. ~/.profilettisql -connstr userinfo -v 1 << EOF | sed -e 's/< //g' | sed -e 's/ >//g' > ~/OptEstimateStats/update.sqlselect 'call ttOptEstimateStats('''||trim(tblowner)||'.'||trim(tblname)||''',1,'''||'51 PERCENT'||'''); commit; sleep 1;'from sys.tables where owner = 1 and tblowner not in ('TTREP', 'SYS')order by tblowner,tblname;quit;EOFsleep 5echo "Begin "`date` >> ~/OptEstimateStats/log/update_`date +%Y%m%d`.logttisql -connStr "dsn=userinfo;uid=ttha;pwd=Lw<Bc7&3" -f ~/OptEstimateStats/update.sql >> ~/OptEstimateStats/log/update_`date +%Y%m%d`.logecho "Ended "`date` >> ~/OptEstimateStats/log/update_`date +%Y%m%d`.logaccountvi update.sh#!/usr/bin/ksh. ~/.profilettisql -connstr account -v 1 << EOF | sed -e 's/< //g' | sed -e 's/ >//g' > ~/OptEstimateStats/update.sqlselect 'call ttOptEstimateStats('''||trim(tblowner)||'.'||trim(tblname)||''',1,'''||'51 PERCENT'||'''); commit; sleep 1;'from sys.tables where owner = 1 and tblowner not in ('TTREP', 'SYS')order by tblowner,tblname;quit;EOFsleep 5echo "Begin "`date` >> ~/OptEstimateStats/log/update_`date +%Y%m%d`.logttisql -connStr "dsn=account;uid=ttha;pwd=Lw<Bc7&3" -f ~/OptEstimateStats/update.sql >> ~/OptEstimateStats/log/update_`date +%Y%m%d`.logecho "Ended "`date` >> ~/OptEstimateStats/log/update_`date +%Y%m%d`.log
13. 老环境变更ini文件(主备)
14. 起应用连接
15. 重建新老环境备库
Userinfottdaemonadmin -stopttdaemonadmin -statrtttdestroy userinfottrepadmin -duplicate -verbosity 2 -from userinfo -host ceshi12 -uid ttha -pwd 'Lw<Bc7&3' -ramload "dsn=userinfo"
--加载:
ttadmin -rampolicy manual -noautoreload account
--起同步进程:
ttisql userinfocall ttrepstart;call ttrepstateget;accountttdaemonadmin -stopttdaemonadmin -startttstatus
--摧毁account:
ttdestroy account
--重建:
ttrepadmin -duplicate -verbosity 2 -from account -host ceshi12 -uid ttha -pwd 'Lw<Bc7&3' -ramload "dsn=account"
--加载:
ttadmin -rampolicy manual -noautoreload account
--起同步进程:
ttisql accountcall ttrepstartcall ttrepstateget;cbedatattdaemonadmin -stopttdaemonadmin -startttstatus
--摧毁cbedata:
ttdestroy cbedata
--重建:
ttrepadmin -duplicate -verbosity 2 -from cbedata -host ceshi19 -uid ttha -pwd 'Lw<Bc7&3' -ramload "dsn= cbedata "
--加载:
ttadmin -rampolicy manual -noautoreload cbedata
--起同步进程:
ttisql cbedatacall ttrepstartcall ttrepstateget;

本文作者:毛龙奇
本文来源:IT那活儿(上海新炬王翦团队)





