我有一个应用程序,它使用Sybase ASE 15.7作为底层数据库。在以前,建议将表拆分,并将它们定位在两个不同的数据库中,比如db1和db2。我知道没有命名冲突,这意味着我可以将对象从db1迁移到db2,反之亦然。
迁移数据的最佳选择是什么。我有SQL脚本来创建记忆数据库中所需的所有对象。有没有比使用这个更好的选择:
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....
有没有一个工具可以连接到这两个数据库并处理这样的事情?
也许有人有个主意。提前谢谢。
向致以最良好的问候
Jens
为了防止日志填充,可以执行未标记的操作。如果不可能,您可以在复制过程中将DB选项设置为截断日志检查点,但第二种方法可能不足以确保日志不会耗尽。如果使用了未标记的操作,则在完成后,应进行完整的DB转储,以创建新基线的备份。如果在离线维护窗口之外进行未记录的操作,则可能存在危险。
截断检查点(执行以下操作,然后执行检查点)
要打开/关闭截断模式,请使用
使用master;
sp_dboption,'trunk log on chkpt',[false|true];
要允许BCP/在数据库上选择INTO(执行以下操作,然后执行检查点)
使用master;
sp_dboption,'select into/bulkcopy/pllsort',[false|true];
执行检查点
要在数据库"dbname"中使用检查点。
使用"dbname";
检查站;
BCP选项
如果您选择使用BCP,请确保使用快速BCP。快速BCP未标记。
确保使用快速BCP的规则在http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc30191.1570100/doc/html/san1367605064460.html.
您可以分两个阶段来完成:一个是"提取"(out)运行,然后是"加载"in运行。命令看起来像这样。
SYBASE/$SYBAS_OCS/bin/bcp${DB1NAME}${TABNAME}out$DUMPDIR/$DB1NAME/${TABNAME}.TXT-c-U$SQLUSER-P$USERPASS-S$SERVER1NAME
SYBASE/$SYBAS_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选项,这样才能工作。
此操作之后,您将需要转储数据库。
由于欧盟的声明,这可能会很慢。另外,并集不是一个好的选择,因为行不是唯一的。
索引
通常,如果目标表(尤其是集群表)上有一个大索引,那么在复制过程中删除它并在复制后重新创建它可能会更有效。