存档
本博客中关于isql和bcp这2个工具的文章有:
ISQL:
BCP:
本文介绍Sybase ASE V15.x版本中isql和bcp这两个工具的新特性。在前面的博文:ASE中的命令行实用工具isql的几个参数的使用方法 中介绍了isql的几个新特性。
将生产环境中AIX5.3平台上的Sybase ASE12.5.2迁移到备机作测试用,下面简单记录下主要步骤。
环境:
Sybase ASE version: 12.5.2 32bit
OS Version: AIX 5.3
$SYBASE: /home/syb123
Instance name: TEST
database name: testdb
备机上建立好了与主机相同的vg与lv
主要步骤:
1.将主机上的目录/home/syb123打包,拷贝到备机,解开tar包到备机的相同目录下。删除备机/home/syb123下的interfaces文件。
例:有表
--sybase
create table t_test(
mydate datetime)
go
--oracle
create t_test(mydate date)
方法1:在sybase侧建立视图,然后从导出视图(此方法舍弃了毫秒部分)
create view v_test as
select
convert(varchar(10),pst_exec_stime,111)+' '+convert(varchar(9),pst_exec_stime,8) mydate
from t_test
go
-
导出表数据到文本文件
在用户表名上点右键,选择批量复制(bcp)下的输出菜单。
选择导出文件的路径。可以针对每个表分区分别指定输出文件路径。此表systbl_Counters仅有一个roundrobin分区。选择将所有分区的数据保存到:c:\sybase\dbo_systbl_Counters_BCP.out。 点下一步,
选择导出文件的格式:字符形式还是本地形式。选择字符形式。点下一步,
把从Sybase或其它类型数据库导出的文本文件再次导入到sybase数据库的时候,bcp是个很好的工具。
本博客已有3篇关于bcp的文章:
如果要用bcp导入很多的表,对每一个表都要写一条语句是件很费劲的事情,尤其表数量很多的时候。简单的方法呢?
第一种方法: 利用SQL语句
在bcp out导出数据的时候,也就是生成相应的bcp out命令语句的时候,也同时生成bcp in导入的命令语句。
生成导出语句的SQL为:
select "bcp "+db_name()+"."+user_name(uid)+"."+name+" out /tmp/databcpout/" +name+ ".txt -Usa -P<sa_passwd> -S<server_name> -c -T10000000 " from sysobjects where type='U' order by name
其中: 将<sa_passwd>,server_name> 分别替换成sa的密码和数据库服务器名。或者用对想要导出的表有查询权限的用户也行。
Sybase ASE15.0及以后的版本中的bcp命令实用工具中有个-Y参数,这个参数的作用是:禁用在服务器中的字符集转化,在使用bcp in时由bcp在客户端上执行字符集转化过程。
只有ASE15.0或更高版本中支持客户端unicode转化。
另外:所有字符集转化都是在bcp out期间在服务器中执行的。
ASE15.0之前的版本中利用bcp这个实用程序只能够导出整表或视图的数据。要想利用bcp有条件得导出表内数据,只能根据条件建立视图,然后 再导出该视图的数据;或者根据条件建立临时表,再导出临时表的数据。但是,都必须在执行bcp命令之前到数据库内部去创建对象(视图或者临时表),然后再 执行bcp命令导出视图或者临时表数据。显然,不是太方便。而其它的数据库管理系统,比如sqlserver早在sqlserver2000就实现了根据 条件queryout数据的功能。利用sybase ASE的第三方工具按条件导出数据也是一种办法。
在ASE 15.0及以后版本中,sybase终于提供了按照条件导出表内数据的办法,虽然实现起来还稍微有一点点小麻烦,但是终究是有这个功能了。参数:--initstring 就是为实现这个功能而加的。
关于参数:--initstring的注意事项有:
1. 参数--initstring之后的SQL语句会在数据导出之前被发送到ASE引擎;
2. 参数--initstring之后的SQL语句被当做会话级别的SQL语句一样处理;
3. 参数--initstring之后的SQL语句在整个bcp导出数据会话期间始终有效;
4. 真正导出的数据是关键字bcp和out之间的表的数据,而不是参数--initstring中select列表的数据。
下面开始举几个例子:
在sybase中复制数据时,经常能够解决到bcp(bulk copy)。
bcp分两种,快bcp和慢bcp。这两种分法是针对bcp in。对于bcp out个人感觉没有快、慢之分,反正就是从sybase的extent上大块大块的拷数据。
今天在bcp 数据in 到一个sybase server的时候,报下面的错误:
C:\Documents and Settings\Administrator>bcp test.dbo.tablename in d:\12 34 -c -Usa -Saix Password: Starting copy... Server Message: SYB_AIX53 - Msg 4806, Level 16, State 1: You cannot run the non-logged version of bulk copy in this database. Please chec k with the DBO. Server Message: SYB_AIX53 - Msg 3621, Level 10, State 0: Command has been aborted. CTLIB Message: - L1/O3/S0/N14/0/0: blk_init(): blk layer: CT library error: Failed when CT_Lib routine ct_results() called. blk_init failed. bcp copy in failed
上error message & troubleshooting guide上查看一下错误编号为:4806的信息。
解释如下:
This error occurs when the select/into bulkcopy option is set to “false” and you
use “fast” bulk copy into a table that has no indexes.
Note In newly created databases, the select into/bulkcopy option is set (by
default) to the same as that in model.
解决的办法有两种:
第一:
启用目的库的"select/into bulkcopy"选项,使用fast bcp模式。这样会不计日志(实际上是记录很少很少的日志记录),也就是说:这不能保证数据库日志的一致性,最好对目的数据库做一个完全备份(dump database),之后才能备份日志。
补充一点:针对有些不计日志的操作导致备份日志不能执行的问题,唯一的办法就是对库做全备。但是,尤其在select into/bulk选项被打开的数据库上,你如何知道这个数据库里曾经执行了不计日志的操作呢?15.0以前的版本是没有好办法的,只能在发出dump tran命令的时候提示不能备份日志需先全备。这是很等的不方便啊~ 终于在15.0版本中,千呼万唤始出来。sybase给我们送来了福音。增加了函数:tran_dumptable_status(),用来返回一个是否允许 dump transaction 的真/ 假指示。 如果 tran_dumpable_status 返回 0,则可以对数据库执行 dump transaction 命令。如果返回任何其它值,则无法执行该命令。非零值有: 1 — 指定名称的数据库不存在。 2 — 日志没有放置在单独的设备上。 4 — 日志首页位于仅限数据的磁盘片段区域内。 8 — 为数据库设置了 trunc log on chkpt 选项。 16 — 在数据库上发生了未记录的写入操作。 32 — 仅截断 dump tran 已中断发送到转储设备的任意连续的转储 系列。 64 — 最近创建或升级了数据库。在执行 dump database 之前,不会 转储事务日志。 现在终于可以在备份脚本加入tran_dumptable_status(),如果返回0,表示可以正常执行备份日志任务。如果返回非0尤其16或者32的时候,先执行数据库全备再执行dump tran操作。
第二:给将要拷贝数据的表上添加索引,让bcp使用慢模式。这样目的数据库会正常的记录日志。就像一条一条的insert语句那样。因此,不会出现完备后 才能备份日志的情况了。但是要注意防止大量的写入操作导致目的数据库日志被写满。可以在bcp in的时候适当时间执行dump transaction with truncate_only,也可以数据分批bcp导入(需要加入-b选项)。
————————————————————————————————————
——— 本文为andkylee个人原创,请在尊重作者劳动成果的前提下进行转载;
——— 转载务必注明原始出处 : http://www.dbainfo.net
——— 关键字:sybase BCP fast 日志 索引 快bcp 慢bcp 完整备份 日志备份
————————————————————————————————————