存档

文章标签 ‘BCP’,文章数:9

本博客中关于isql和bcp这2个工具的文章有:

ISQL:

  1. Sybase ASE中用isql连接数据库失败时的错误信息所反馈的信息
  2. ASE中的命令行实用工具isql的几个参数的使用方法

BCP:

  1. 关于BCP工具的使用,介绍三个方面的东西
  2. 关于Sybase中的快bcp
  3. ASE15.x的bcp能够实现按照条件导出表内数据
  4. bcp导出数据时禁止字符集转化
  5. 快速生成bcp in导表命令行的方法

本文介绍Sybase ASE V15.x版本中isql和bcp这两个工具的新特性。在前面的博文:ASE中的命令行实用工具isql的几个参数的使用方法 中介绍了isql的几个新特性。

1 BCP

1.1 Skip number of rows: --skiprows (SDK 12.5.1 ESD #19)

1.2 Partition support for multiple-partition, multiple-file operations (ASE 15.0)

1.3 Computed columns: --hide-vcc / --show-fi (ASE 15.0)

1.4 Encrypted columns: -C (ASE 15.0 ESD #1 / SDK 12.5.1 ESD #5)

1.5 Initialization strings: --initstring (ASE 15.0 ESD #5)

1.6 Discard file support for rejected rows: -d (ASE 15.0 ESD #8)

1.7 Alternate Sybase home: -y (New Features in 15.0.2 ESD#5 / SDK 15.0 ESD#2)

1.8 bcp64 for 64-bit products on UNIX platforms (New Features in 15.5 ESD #9)

1.9 Usage

2 ISQL

2.1 isql external error status return: --retserverror (ASE 15.0.2 ESD#4 / SDK 15.0 ESD#10)

2.2 Alternate Sybase home: -y (ASE 15.0.2 ESD#5 / SDK 15.0 ESD#2)

2.3 Redirects/Append the output of the T-SQL command to file_name (ASE 15.0.2 ESD#5 / SDK 15.0 ESD#12)

2.4 Pipes the output of the T-SQL command to an external command (ASE 15.0.2 ESD#5 / SDK 15.0 ESD#12)

2.5 Obfuscated input: --conceal (ASE 15.0 ESD #13)

2.6 Verbose usage: --help (ASE 15.0 ESD #14)

2.7 Application name: --appname (ASE 15.0.3 ESD#4 / OCS 15.0 ESD#17 / OCS 15.5)

2.8 Command history: --history (ASE 15.0.3 ESD#4 / OCS 15.0 ESD#18 / OCS 15.5)

2.8.1 Command history

2.8.2 Listing command history

2.8.3 Recalling and reissuing commands

2.9 isql64 for 64-bit products on UNIX platforms (New Features 15.5 ESD #9)

2.10 Usage

3 Sources

3.1 New Features Open Server™ 15.5 and SDK 15.5 for Windows, Linux, UNIX, and Mac OS X

3.2 New Features Open Server™ 15.0 and SDK 15.0 for Microsoft Windows, Linux, UNIX, and Mac OS X

将生产环境中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

  1. 导出表数据到文本文件

在用户表名上点右键,选择批量复制(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 完整备份 日志备份
————————————————————————————————————