我有一个使用Sybase ASE 15.7作为底层数据库的应用程序。在过去的日子里,建议拆分表并将它们放在两个不同的数据库中,比如说db1和db2。我知道没有命名冲突,这意味着我可以将对象从db1迁移到db2,反之亦然。
迁移数据的最佳选择是什么。我有SQL脚本来创建我需要的所有对象在remeining数据库中。有没有比使用它更好的选择:
1> INSERT INTO db2..tblA
2> SELECT * FROM db1..tblA
3> GO
有些表非常庞大。所以我需要注意事务日志没有填满。
BCP也可能是这样的选择:
bcp db1..tblA out tblA.save -U... -P....
bcp db2..tblA in tblA.save -U... -P....
是否有可用的工具可以连接到两个数据库并可以处理这样的事情?
也许有人有个主意。提前谢谢。
祝你好运
延
答案 0 :(得分:1)
为防止日志填满,您可以执行未记录的操作。 如果不可能,您可以将数据库选项设置为在复制过程中截断日志检查点,但第二种方法可能不足以确保日志不会耗尽。 如果使用未记录的操作,则在完成后应执行完整的数据库转储以创建新基准的备份。 如果在脱机维护窗口之外完成,未记录的操作可能会有危险。
在Checkpoint上截断(执行以下操作,然后执行检查点)
要打开/关闭截断模式,请使用
使用master;
sp_dboption,'trunc log on chkpt',[false | true];
允许BCP /在数据库中选择INTO(执行以下操作然后执行检查点)
使用master;
sp_dboption,'select into / bulkcopy / pllsort',[false | true];
执行检查点
要在DB'dbname'中检查点,请使用。
使用'dbname';
检查点;
BCP选项
如果您选择使用BCP,请确保使用快速BCP。快速BCP未登记。
确保使用快速BCP的规则在http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc30191.1570100/doc/html/san1367605064460.html指定。
您可以分两个阶段执行'extract'(out)运行,然后运行'load'。命令看起来像这样。
SYBASE / $ SYBASE_OCS / bin / bcp $ {DB1NAME} .. $ {TABNAME} out $ DUMPDIR / $ DB1NAME / $ {TABNAME} .TXT -c -U $ SQLUSER -P $ USERPASS -S $ SERVER1NAME
SYBASE / $ SYBASE_OCS / bin / bcp $ {DB1NAME} .. $ {TABNAME} $ DUMPDIR / $ DB1NAME / $ {TABNAME} .TXT -c -U $ SQLUSER -P $ USERPASS -S $ SERVER1NAME
需要在数据库中设置select into / bulk copy DB选项才能使其生效。
此操作后您需要转储数据库。
未记录的操作 - 选择进入
由于您可以从同一服务器内访问这两个数据库,因此您应该查看使用select into。
'select into'是一个未记录的操作。
select into语句的目标表不可存在,因此您需要做的是使用sp_rename移动原始目标表,然后使用查询中的两个源表运行select into。
需要为数据库设置select into / bulk copy DB选项才能使其正常工作。
此操作后您需要转储数据库。
由于Union声明,这可能会很慢。联合不是一个好选择,因为行不是唯一的。
<强>索引强>
一般情况下,如果目标表上存在大型索引(尤其是群集索引),则在复制期间删除它并在之后重新创建它可能会更有效。