使用BCP迁移数据库
- 格式:docx
- 大小:20.00 KB
- 文档页数:3
SQLServer中bcp命令的⽤法以及数据批量导⼊导出0.参考⽂献:1.bcp命令参数解析bcp命令有许多参数,下⾯给出bcp命令参数的简要解析⽤法: bcp {dbtable | query} {in| out | queryout | format} 数据⽂件[-m 最⼤错误数][-f 格式化⽂件][-e 错误⽂件][-F ⾸⾏][-L 末⾏][-b 批⼤⼩][-n 本机类型] [-c 字符类型] [-w 宽字符类型][-N 将⾮⽂本保持为本机类型][-V ⽂件格式版本][-q 带引号的标识符][-C 代码页说明符][-t 字段终⽌符][-r ⾏终⽌符][-i 输⼊⽂件] [-o 输出⽂件] [-a 数据包⼤⼩][-S 服务器名称] [-U ⽤户名] [-P 密码][-T 可信连接] [-v 版本][-R 允许使⽤区域设置][-k 保留空值][-E 保留标识值][-h"加载提⽰"][-x ⽣成xml 格式化⽂件]其中最常⽤的已经⽤粉红⾊字体标注。
2.bcp命令实例这⾥我们以AdventureWorks样例数据库为例进⾏实验。
2.1.将表中数据导出到⼀个⽂件中(使⽤可信连接)bcp AdventureWorks.Sales.Currency out c:\Currency.dat -T -c上⾯的参数 out 表⽰输出⽂件,c:\Currency.dat是⽂件名和路径,-T表⽰可信连接,这个跟sqlcmd有点不同,在sqlcmd中使⽤-E表⽰可信连接。
-c表⽰以字符形式输出,如果使⽤-w的话,输出内容相同,但是输出⽂件的⼤⼩将增加⼀倍。
如果你要将导出的Currency.dat⽂件导⼊到⾮sql server数据库中,那么使⽤-w⽐较好。
2.2.将表中数据导出到⼀个⽂件中(使⽤混合模式⾝份验证)bcp AdventureWorks.Sales.Currency out c:\Currency.dat -c -Usa -Psa12345 -S.这个数据导出语句与前⾯的不同之处是,前⾯使⽤可信连接,也就是windows验证,不需要输⼊⽤户名和密码。
SQL Server数据导入导出工具BCP详解及xp_cmdshell开发者在线 本文关键词:SQL Server 导入导出bcp exec xp_cmdshellBCP是SQL Server中负责导入导出数据的一个命令行工具,它是基于DB-Library的,并且能以并行的方式高效地导入导出大批量的数据。
BCP可以将数据库的表或视图直接导出,也能通过SELECT FROM语句对表或视图进行过滤后导出。
在导入导出数据时,可以使用默认值或是使用一个格式文件将文件中的数据导入到数据库或将数据库中的数据导出到文件中。
下面将详细讨论如何利用BCP导入导出数据。
1. BCP的主要参数介绍BCP共有四个动作可以选择。
(1) 导入。
这个动作使用in命令完成,后面跟需要导入的文件名。
(2) 导出。
这个动作使用out命令完成,后面跟需要导出的文件名。
(3) 使用SQL语句导出。
这个动作使用queryout命令完成,它跟out类似,只是数据源不是表或视图名,而是SQL 语句。
(4) 导出格式文件。
这个动作使用format命令完成,后而跟格式文件名。
下面介绍一些常用的选项:-f format_fileformat_file表示格式文件名。
这个选项依赖于上述的动作,如果使用的是in或out,format_file 表示已经存在的格式文件,如果使用的是format则表示是要生成的格式文件。
-x这个选项要和-f format_file配合使用,以便生成xml格式的格式文件。
-F first_row指定从被导出表的哪一行导出,或从被导入文件的哪一行导入。
-L last_row指定被导出表要导到哪一行结束,或从被导入文件导数据时,导到哪一行结束。
-c使用char类型做为存储类型,没有前缀且以"t"做为字段分割符,以"n"做为行分割符。
-w和-c类似,只是当使用Unicode字符集拷贝数据时使用,且以nchar做为存储类型。
MSSQL数据库导出根据id批量导出数据、BCP工具很实用数据导出不只是bcp这一种方式,不过bcp的最大优点是可以根据id批量导出数据,这样是节省时间的。
还有一种是直接在页面导出数据,页面列出数据库中的数据,然后选择一种方式(如xls)导出来。
由于日常基本都是与数据库打交道,我会经常遇到数据转移的需求。
类似于:将服务器A的表数据转移到服务器B的同名表中,或将线上服务器的一部分数据拉到线下测试服务器供开发人员调试。
通常来说,有以下几种表到表的复制方法:1.建链接服务器,写INSERT语句。
适用于两台服务器能互相连接,在表的数量比较少的情况下,手动写INSERT语句还是可以接受的。
但如果两台服务器无法互联或连接速度较慢,或者多个表需要手写插入列名,写起来会很麻烦,还要调试语句。
2.查询出所有数据或需要导出的数据或用导出工具存成EXCEL,再用导入工具导入目标表。
对于数据量不大、比较标准、可以规则的存成EXCEL的数据可以使用这种方法,反之会有各种问题,最常见的就是大文本在导出成EXCEL后经常会无法原样导入,报各种格式错。
3.查出需要导出的数据,复制一下,在SSMS的编辑两200行中选中行复制。
这种方法和第二种问题类似,更快一点,但要求也更严。
要求更小的数据量,更规则的数据。
4.原库做备份--目标服务器还原备份--跨库插入数据或者直接用还原的库。
这种能完全COPY多个表,但缺点一是麻烦,二是需要登陆到服务器上复制备份文件下来,这在管理严密的公司里很可能是要领导签字的。
大家懂的,所以我也不常用这种方法。
5.BCP实用工具,也就是本文要介绍的,我现在最常用的数据迁移工具。
无视大文本的不规则字符,无视大数据量,通过中间文件传输,不必登陆服务器本机。
下面就从最简单的例子入手,介绍一下BCP的用法。
假设源表名T1,数据库名DB1,服务器器实例为SERVER1,目标表名T2,数据库名DB2,服务器实例为SERVER2。
Sybase数据库BCP导入导出操作手册目录1。
常用数据库备份类型12.BCP数据导出使用情况 (2)3.BCP数据导入导出操作方法 (2)3。
1。
生成BCP导出语法23。
2.BCP数据导出33.3.BCP数据导入 (3)3.4。
分段导入以及日志清理33。
5.前后台BCP out&in语法生成器44。
注意事项51.常用数据库备份类型●使用Sybase的Backup Server(备份服务器),做Dump备份。
●转储数据库(Dump database),就是为整个数据库(包括数据、表结构、触发器、游标、存储过程、事务日志等)做一次物理备份。
转储数据库时,系统自动执行一次checkpoint,即将日志和数据从缓冲区拷贝到硬盘(只拷贝脏页),把已被分配的页(日志和数据)转储到设备。
这种数据备份方式是将整个数据库的运行环境完整的复制一份,包括数据库的脏页和碎片,在使用load命令恢复时,只能恢复到同样大小的数据库中(数据和日志的大小都只能和原来完全一致),适用于在每天的日终营业网点下班后的日常备份。
优点是数据库完整无误,缺点是不能直接查看备份内容.●●BCP数据库备份● BCP(bulk copy)是SYBASE公司提供专门用于数据库表一级数据备份的工具,一般存放在所安装的ASE或者Open Client 的BIN目录中。
利用这个命令来处理数据的备份和恢复,比软件中提供的数据备份、恢复要快的多,因为该命令对数据的操作不产生日志.2.BCP数据导出使用情况●如果数据库受到硬伤(如数据库挂起无法恢复、或者系统表结构损坏等),造成数据不能通过备份服务器进行正常备份,或者正常备份的数据库也一样是损坏的,就要通过BCP数据导出方式,把数据库所有表数据导出来,再进行恢复。
●通过bcp备份恢复可以去掉原数据库的碎片,减小数据库大小,提高数据库的存储效率和运行速度:Sybase数据库作为联机事务处理应用服务器,每天应用程序都对数据库做大量的插入、修改和删除等操作,不可避免的在数据库的物理存储介质上留下页碎片和扩展单元碎片,从而影响数据库的存储效率和运行速度。
用bcp工具导入和导出批量数据微软SQL Server中的批量复制工具程序(Bulk Copy Program,BCP)能让数据库管理员将数据批量导入表中或将数据从表中批量导入文档中。
它还支持一些定义数据如何导出、导入到什么地方、加载哪些数据等选项。
本技巧讨论一些用bcp命令批量复制数据迁入或迁出SQL Server表的示例。
这些示例在SQL Server 2005和SQL Server 2008上已经测试过。
并且我还用了AdventureWorks样本数据库。
用bcp工具导入数据一个最简单的操作就是你可以用bcp工具将数据从SQL Server表bulk-copy到文本文件。
在Windows命令提示符中插入命令,你就可以运行bcp命令了。
例如以下命令,从AdventureWorks数据库里的Sales.vSalesPerson视图复制数据到C:\Data\SalesPerson.txt文件:bcp AdventureWorks.Sales.vSalesPerson out C:\Data\SalesPerson.txt -c –T如同你看到的一样,bcp命令以工具名称开头,后面为完全合格表名database.schema.table。
接下来就是out 关键字,关键字告诉bcp工具数据将会从该表中导出。
目标文本文件的路径和文件名称紧跟out 关键字之后。
注意本文中列出的命令例子可能包括很多行,但是所有的例子应该像一个单独的命令一样运行。
除了这些基本参数,bcp工具还支持控制工具行为的switch。
在以上例子中,无论数据是以何种方式存储在源表中的,-c switch表示所有的数据都应是字符数据。
如果你没有指定-c开关或其他相关类型的switch,你就需要在进入bcp命令后指定每个列的switch类型。
上述例子中另一个switch就是-T,它主要是告诉bcp工具使用可靠连接来关联SQL Server示例。
Sybase使用BCP命令导入数据,Identity属性主键的处理
Sybase使用BCP命令导入数据,Identity属性主键的处理
(2010-01-23 21:31:48)
转载
标签:
sybase
bcp
identity
分类:哈哈写程序
主键
自增
it
程序定时使用BCP命令到处需要备份的表数据。
在测试导入时,发现Identity属性的主键值会递增。
这样会导致引用它的外键约束失效。
使用SET IDENTITY_INSERT [ database.[ owner.] ] { table } { ON | OFF } 可以解决问题。
但任何时候,会话中只有一个表的IDENTITY_INSERT 属性可以设置为 ON。
如果某个表已将此属性设置为 ON,并且为另一个表发出了 SET IDENTITY_INSERT ON 语句,则会返回一个错误信息,指出 SET IDENTITY_INSERT 已设置为 ON 并报告此属性已设置为 ON 的表。
这样用户如果使用bcp in 命令来恢复数据库会太麻烦了。
后面发现bcp命令加一个-E参数,导入即可以自动使用SET
IDENTITY_INSERT ON | OFF,很方便。
bcp 数据库名.所有者.tableName in /filePath/file.txt - Usa -Ppassword -SserverName -c -E。
sqlserver bcp语句SQL Server BCP(Bulk Copy Program)是一种用于高效地将大量数据从文件复制到SQL Server表中的工具。
它可以通过命令行或脚本调用,提供了一种快速、可靠的方式来导入和导出数据。
下面将列举10个关于SQL Server BCP语句的例子。
1. 导出整个表的数据到文件:```bcp [数据库名].[模式名].[表名] out [文件路径] -S [服务器名] -U [用户名] -P [密码] -c -t, -T```这个命令将指定表的所有数据导出到指定的文件路径中,使用逗号作为字段分隔符,并且使用Windows身份验证登录到SQL Server。
2. 导入文件中的数据到表:```bcp [数据库名].[模式名].[表名] in [文件路径] -S [服务器名] -U [用户名] -P [密码] -c -t, -T```这个命令将指定文件中的数据导入到指定的表中,使用逗号作为字段分隔符,并且使用Windows身份验证登录到SQL Server。
3. 导出查询结果到文件:```bcp "SELECT * FROM [数据库名].[模式名].[表名] WHERE [条件]" queryout [文件路径] -S [服务器名] -U [用户名] -P [密码] -c -t, -T ```这个命令将指定查询的结果导出到指定的文件路径中,使用逗号作为字段分隔符,并且使用Windows身份验证登录到SQL Server。
4. 导入文件中的数据到临时表:```bcp [数据库名].[模式名].[表名] in [文件路径] -S [服务器名] -U [用户名] -P [密码] -c -t, -T -h"TABLOCK"```这个命令将指定文件中的数据导入到指定的临时表中,使用逗号作为字段分隔符,并且使用Windows身份验证登录到SQL Server。
sqlserver中⽤bcp导⼊数据遇到在BCP数据⽂件中遇到的意外的EOF错误将A地的符合条件的⽂件恢复到B地机器上。
对⽅管理员什么也不懂,所以想做的尽量傻⽠,免得要跟他说明半天如何操作。
--⽤查询语句导出⽂本⽂件--EXEC master..xp_cmdshell 'bcp "select * from [TestDB11-27]..restoreweihai" queryout c:\test.txt -F 2 -c -S "192.168.102.122" -U"sa" -P"pass"'--导出查询数据到XML⽂件--EXEC master..xp_cmdshell 'bcp "select * from [TestDB11-27]..tline_tw for xml raw,binarybase64" queryout c:\\aa.xml -c -S"192.168.102.122" -U"sa" -P"pass"'--从⽂本⽂件导⼊数据到数据库--EXEC master..xp_cmdshell 'bcp Customer..order in c:\test.txt -c -S "192.168.102.122" -U sa-P pass'这⾥有⼏点需要注意1 写查询语句导出时,⽤queryout⽐较好,我⽤out 时怎么也不成功,改queryout才⾏。
2 库名带空格,- 等字符时⽤“[ ]”括起来,这个在线帮助中有。
3 导⼊时使⽤的⽂件必须与导出时⽣成的⽂件⼀致,否则会出现复制失败,接受的导⼊默认是制表符分隔的⽂件,⽽DTS⽣成的⽂件⽤了很多引号或者括号之类的来分隔字段,所以DTS导出的⽂本与BCP导出的⽂本不能通⽤,否则会出现“在BCP数据⽂件中遇到的意外的EOF”错误。
用BCP命令实现Sybase数据向SQL Server的转换BCP命令是SQL Server和Sybase用来备份和恢复数据用的工具,它使用方便,备份、恢复速度快。
在SQL Server中和在Sybase中使用bcp命令,语法格式相似。
因此,实践中审计人员在对Sybase数据库数据进行采集转时,可以考虑先用bcp命令将Sybase数据库数据以文本格式导出,再用bcp 命令将由Sybase导出的文本格式文件导入到SQL Server数据库。
值得注意的是:在同一机器中如果同时安装了SQL Server 和Sybase后,用bcp命令对SQL Server数据库或Sybase数据库进行导入导出操作时,常会出现如下错误:1、对SQL Server数据库进行bcp操作可能出现的错误:2、对Sybase 数据库进行bcp操作可能出现的错误:这是由于在同一台机器上安装SQL Server和Sybase后,环境变量变了,在执行bcp命令时,系统找到的不是对应的bcp。
解决问题的方法是:用bcp命令对SQL Server 数据库进行导入导出操作时,就将SQL Server对应的环境变量提前;用bcp 命令对Sybase数据库进行导入导出操作时,就将Sybase对应的环境变量提前。
设置过程如下:我的电脑→属性→高级→环境变量双击系统变量path,进入“编辑系统变量”,复制变量值粘贴到到一个空记本事,选定要提前的内容,复制、粘贴到最前面,再将修改后的内容全部复制、粘贴回变量值,点击“确定”保存设置(如不能立即生效,则重启机器)。
下面以转换某县社保部门Sybase数据库备份数据为例(**.dat格式),说明转换过程:一、安装Sybase,在Sybase中新建一个为zysb的数据库(用户sa ,密码为空),在该数据中还原Sybase备份数据(备份数据存放位置为f:\zysb.dat),还原过程命令格式为:C:\Documents and Settings\Administrator>isql -Usa -P1> load database zysb from f:\zysb.dat2>go1> online database zysb2>go二、在SQL Server中新建一个数据库,为方便导入也命名为zysb,打开该SQL Server数据库。
今天上网查了查资料,知道了bcp简单的转入和转出操作。
一、BCP是SyBase公司提供的专门用于数据库表一级数据备份工具,因此它的操作是对表进行的。
二、常用的语句如下:导出表:bcp dbname .. tablename out c:\temp\filename -u sa -p password -s servername -cdbname 数据库名;tablename表名;-u 后为登陆名称;-p 后登陆口令;-c 表示使用可见文本方式导出数据。
其中在数据名和表名中间是两个点。
导入表:bcp dbname .. tablename in c:\temp\filename -u sa -p password -s servername -c注:二者的区别仅是out和in的区别而已。
三、使用sql产生bcp命令快速备份/恢复你所有数据(仅用于sybase和mssqlserver数据库)(转载,有空研究一下吧)bcp命令是sybase和ms sql server用来备份和恢复数据用的工具,它使用方便,备份/恢复速度快。
当table过多时,编写批处理是一件繁琐的事情。
可以使用下面方法快速生成bcp的批处理select ''bcp database..'' + name + '' out '' + ''/data/'' + name + ''.out'' + '' -n -sservername -usa -pxxx'' from database..sysobjects where type = ''u''将上面database换成自己需要备份的数据库名称,-sservername改为对应sql server名称-pxxx 将xxx换成实际sa密码,上面语法是用来备份数据,将第一行中的out改为in即可生成恢复数据的批处理以上可以在sybase或ms sql server的isql中执行(ms sql server 7.0中isql已变为query analyzer),然后将执行结果通过剪贴板copy到记事本(注意不要copy结果集的标题),保存为bat文件。
使用BCP迁移数据库
一、导出
(1)建立一个名为input的文件,输入以下内容:
use kjdbs
go
select 'bcp kjdbs..' + name + ' out /opt/bcp/' + name + ' -Usa -P -Sbddbs -c -t@#@#@# -E' from sysobjects where type = 'U'
go
其中:
-U后为SYBASE登录名称,-P后为SYBASE登录口令,-S后为SYBASE服务名称,-c代表使用可见文本方式导出数据,out后面为导出数据的路径的位置,in则为导入路径
-t field_terminator 指定缺省的字段终结符
-r row_terminator 指定缺省的行终结符(特殊的数据库需要使用例如ledbs)
-E 显示指定表的IDENTITY 列的值(自动递增列)
-b batch_size
指定所复制的每批数据中的行数。
每个批处理作为一个事务复制至服务器。
(2)在命令行界面输入:
/opt/sybase/bin/isql -Usa -Sjcydbs2 -P -i input -o output
其中i表示输入文件,o表示输出文件。
执行完后,会在当前目录创建一个名为output的文件,打开后可以看到如下
bcp kjdbs..rnews out /opt/bcp/rnews -Usa -P -Srddbs -c -t@#@#@# -E
bcp kjdbs..test2 out /opt/bcp/test2 -Usa -P -Srddbs -c -t@#@#@# -E
...
将会列出数据库中所有的表
(3)使用SqlDbx工具打开数据库,查看所有表的结构,将没有IDENTITY标示列的表的“-E”参数去掉,比如rnews这个表没有IDENTITY标识列(简单说,-E参数就是能保证有IDENTITY 标识列的表的标识列数据不会变化,如果不过-E,数据会从1开始递增,如果没有IDENTITY 标识列的表使用-E参数,导出时将会报错提示该表没有IDENTITY标识列)
bcp kjdbs..rnews out /opt/bcp/rnews -Usa -P -Srddbs -c -t@#@#@#
最后,经过对-E参数的筛选,将会得到可以用作导出的output文件,在命令行输入命令“sh output”,数据会在指定位置产生。
注意:有些特殊数据库的某个表导出可能会出问题,例如ledbs(目前只发现这一个数据库有这种问题),导出的时候需要在-t的参数后面再添加一个-r参数,也就是行终止符。
Ledbs的input文件:
use ledbs
go
select 'bcp ledbs..' + name + ' out /opt/bcp/' + name + ' -Usa -P -Sbddbs -c -t@#@#@# -r"||"
-E' from sysobjects where type = 'U'
go
(4)使用scp的方式将output文件以及导出的数据库拷贝到远程主机上
二、导入
(1)BCP导入就比较简单,首先需要根据原数据库使用的情况建立相应的数据库,然后根据不同数据库建立不同的用户
(2)使用sybase central,打开指定的数据库,右键数据库选择“Generate Database Objects DLL”将会产生建立数据库包括表的Sql语句,选择建立表和授权的部分进行复制,然后打开SqlDbx,选择新建的数据库,粘贴执行,建立所需要的表。
(产生DLL文件的时候可能会报错,这是tempdb没有开启“select into”的原因)
(3)接下来是导入的重点注意的地方,bcp导入需要开启数据库“select into”和自动清除日志功能(bcp导入会产生大量的日志,需要结合-b参数来避免日志空间满而导致bcp失败)/opt/Sybase/bin/isql –Usa –Sbddbs –P
1> use master
2> go
1> sp_dboption kjdbs,'select into',true
2> go
Database option 'select into/bulkcopy' turned ON for database 'kjdbs'.
Run the CHECKPOINT command in the database that was changed.
(return status = 0)
1> sp_dboption kjdbs,'trunc log on chkpt',true
2> go
Database option 'trunc log on chkpt' turned ON for database 'kjdbs'.
Run the CHECKPOINT command in the database that was changed.
(return status = 0)
1> use kjdbs
2> go
1> checkpoint
2> go
Select into 在使用数据库的时候,有时我们需要把一个表中的数据经过筛选插入另外一个表中。
Sybase提供一种特殊的方式来实现这一功能,这就是select into。
trunc log on chkpt 开启日志自动清理,可以结合dump transaction kjdbs with truncate_only 使用
(4)数据库设置已经完成,开始导入数据,将output中的out替换为in。
首先查看数据比较大的表,比如rnews这个表,kjdbs的rnews 导出后大概会有850M左右,这样如果直接导入会直接将日志空间直接爆满,然后就会停止。
单独执行rnews导入,:
bcp kjdbs..rnews in /opt/bcp/rnews -Usa -P -Sbddbs -c -t@#@#@# -b 5000
-b5000 代表以5000行为一个批处理提交到数据库
这样就会减缓导入的速度,日志清理会定期清理(执行checkpoint就会清理,大概1分钟12次左右),如果某个阶段导入停止,可以使用dump transaction kjdbs with truncate_only来清理日志
注意:
dump transaction with truncate_only
dump transaction with no_log
通常删除事务日志中不活跃的部分可使用“dump transaction with trancate_only”命令,这条命令写进事务日志时,还要做必要的并发性检查。
SYBASE提供“dump transaction with no_log”来处理某些非常紧迫的情况,使用这条命令有很大的危险性,SQL Server会弹出一条警告信息。
为了尽量确保数据库的一致性,你应将它作为“最后一招”。
当rnews数据库导入完成,先验证一下数据的完整性和可用性,使用“select count (*)from rnews”和“set rowcount 1000 select * from rnews”来验证。
rnews导入完成后,可以在output的rnews前注释掉这一行,然后执行导入,最后验证一下导入的数据是否完整,如果完整,则整个BCP导出导入完成。
最后不要忘记在关闭日志的自动清理功能,只要将true修改成false,执行checkpoint 即可。