数据库复制

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_copydb]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_copydb]
GO


/*--数据库数据复制

 将一个数据库中的数据复制到另一个数据库
 如果某列在目标数据库中为标识列,将不会被复制

 适用范围:数据库结构发生了变化,想将旧数据库进行升级
  这样就可以根据新的数据库结构创建一个空库,然后
  将旧数据库的所有数据复制到新库中

--邹建 2003.10(引用请保留此信息)--*/

/*--调用示例

 exec p_copydb 'bns_aa','bns_new'
 exec p_copydb 'acc_五医','acc_演示数据8'
--*/
create proc p_copydb
@o_dbname sysname,  --要复制数据的数据库--源数据库
@n_dbname sysname  --接收数据的数据库--目标数据库
as
declare @sql nvarchar(4000)

--禁用约束/触发器,防止复制时的数据冲突
set @sql='declare #tbc cursor for select name
 from '+@n_dbname+'..sysobjects where xtype=''U'' and status>=0'
exec(@sql)

declare @tbname sysname
open #tbc
fetch next from #tbc into @tbname
while @@fetch_status=0
begin
 set @sql='alter table '+@n_dbname+'..['+@tbname+'] NOCHECK CONSTRAINT ALL'
 exec(@sql)
 set @sql='alter table '+@n_dbname+'..['+@tbname+'] disable trigger ALL'
 exec(@sql)
 fetch next from #tbc into @tbname
end
close #tbc

--复制数据
declare @sql1 varchar(8000)
set @sql='declare #tb cursor for select a.name from '
 +@o_dbname+'..sysobjects a inner join '
 +@n_dbname+'..sysobjects b on a.name=b.name
  where a.xtype=''U'' and b.xtype=''U'''
exec(@sql)
open #tb
fetch next from #tb into @tbname
while @@fetch_status=0
begin
 select @sql1=''
  ,@sql='select @sql1=@sql1+'',[''+a.name+'']'' from(
  select name from '+@o_dbname+'..syscolumns where id in
  (select id from '+@o_dbname+'..sysobjects where name='''+@tbname+''')
 ) a inner join (
  select name from '+@n_dbname+'..syscolumns where status<>0x80 and id in
  (select id from '+@n_dbname+'..sysobjects where name='''+@tbname+''')
 ) b on a.name=b.name'
 exec sp_executesql @sql,N'@sql1 nvarchar(4000) out',@sql1 out

 select @sql1=substring(@sql1,2,8000)
 exec('insert into '+@n_dbname+'..['+@tbname+']('+@sql1
  +') select '+@sql1+' from '+@o_dbname+'..['+@tbname+']')
 if @@error<>0
  print('insert into '+@n_dbname+'..['+@tbname+']('+@sql1
   +') select '+@sql1+' from '+@o_dbname+'..['+@tbname+']')
 fetch next from #tb into @tbname
end
close #tb
deallocate #tb

--数据复制完成后启用约束
open #tbc
fetch next from #tbc into @tbname
while @@fetch_status=0
begin
 set @sql='alter table '+@n_dbname+'..['+@tbname+'] CHECK CONSTRAINT ALL'
 exec(@sql)
 set @sql='alter table '+@n_dbname+'..['+@tbname+'] enable trigger ALL'
 exec(@sql)
 fetch next from #tbc into @tbname
end
close #tbc
deallocate #tbc
go




/** * 源数据库库连接池配置 * */ ConnPoolConfig config = new ConnPoolConfig(); config.setMaxPoolSize(30); config.setInitialPoolSize(20); config.setUrl("jdbc:sqlserver://192.168.0.222;databaseName=ciems"); config.setDriverClass("com.microsoft.sqlserver.jdbc.SQLServerDriver"); config.setUsername("sa"); config.setPassword("Password2017"); /** * 源库 * "queryDB" DBManager的自定义名称 * config 连接池配置 */ DBManager queryDb = new DBManager("queryDB",config); /** * 目标数据库连接池配置 * */ ConnPoolConfig tarconfig = new ConnPoolConfig(); tarconfig.setMaxPoolSize(30); tarconfig.setInitialPoolSize(20); tarconfig.setDriverClass("com.mysql.jdbc.Driver"); tarconfig.setUrl("jdbc:mysql://localhost:3306/datatransfer?useUnicode=true&characterEncoding=UTF8&useSSL=true"); tarconfig.setPassword("accp"); tarconfig.setUsername("root"); /** * 目标库 */ DBManager insertDb = new DBManager("insertDB",config); /** *做数据导入处理时的接口 * */ InsertHandler handler = new DBInsertHandlerImpl("t_big_data",null,insertDb); /** * 迁移任务的配置,配置关键信息项 */ ApplicationConfig apConfig = new ApplicationConfig("t_big_data"); apConfig.setQueryThreadNum(8); //指定查询线程数量,不指定默认为8 apConfig.setDataNum(5000); //设置每次从源库中抽取的数量 不指定默认为5000 /** * 源表的匹配条件 * 如果希望源表中符合条件的才迁移,请配置此项,禁止加where,请按照以下格式 */ apConfig.setConditionSql("0=0"); /** * 入库方式 * ** * 增量入库 ZLRK, (暂未实现) * 追加入库 ZJRK, (目标库有源表结构的基础上,增加源表的所有数据到目标库中) * 刷新入库 SXRK, (删除目标库的源表结构,自动创建并导入数据) * 更新入库 GXRK (暂未实现) * ** */ apConfig.setInsertType(InsertType.SXRK); /** * 日志线程,开启时可更直观的从标准输出流里观察到运行状态,不指定默认关闭 */ apConfig.setOpenLogThread(true); /** * 生命周期接口,线程不完全 * 分别有以下几个生命周期方法 * createTableDone() 目标库被创建表结构时调用一次 * queryDone(boolean result, int start, int end, long time,Throwable e) * 有数据从源表中查询到数据时被调用,直到任务完成 * result 查询结果 * start 查询起始行 * end 查询结束行 * time 共耗时 单位:ms * e 查询失败时抛出的异常 * insertDone(boolean result, int num, int errorNum, long time,Throwable e) * 有数据导入到目的库时被调用,直到任务完成 * result 导入结果 * num 导入总数量 * errorNum异常数量 * e 导入失败时抛出的异常 * taskDone(int all, int doneNum, int errorNum, long time,List errorRows, List e) * 任务完成时被调用 * all 任务总数据量 * doneNum 已完成的数据量 * errorNum异常的数据量 * time 总耗时 * errorRows异常的行记录 * e 所有的异常 */ TaskRunLog runLog = new TaskRunLogImpl(); /*** * 任务迁移核心类 * 以下是构造方式之一 * ApplicationConfig apConfig:任务关键配置 * DBManager queryDb: 源库 * InsertHandler handler:导入处理器 */ DataThransferApplication app = new DataThransferApplication(apConfig,queryDb,handler,runLog); /** * 初始化任务 */ app.init(); /** * 任务开始 */ app.start();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值