我正在计划将 2TB 数据库实时迁移到分区表的过程。从广义上讲,该系统是一个文档存储,大部分空间分配给 50kb 到 500kb 之间的 LOB,一小部分在 500kb 到 1MB 范围内。部分迁移将涉及从旧数据库到新数据库的 BCPing 数据。
BCP 是首选方法,因为数据中的当前/历史鸿沟允许在最终切换之前分阶段(在较安静的时期)提取较旧的数据,从而最大限度地减少对实时系统的影响。数据量和存储可用性排除了对分区方案的原位重建。
由于 BLOB 内容,我怀疑通过尝试使用 KILOBYTES_PER_BATCH 而不是 ROWS_PER_BATCH 可能会获得一些性能提升。BCP文档中建议SQL可以根据这个值优化操作。
我找不到关于这些优化的性质或从哪里开始测试的任何指导。在没有建议的情况下,我将尝试在 4/8/16/32/64mb 边界处进行短期运行。
可能会从更改数据包大小(BCP -a 参数,而不是服务器级别设置)中获得一些收益,但我倾向于将其提高到最大 65535,除非有人有更公式化的方法。
我有一个存储过程,它每隔一段时间运行一次作业,以 BCP 处理我编写的应用程序留下的一些文件。
我注意到文件堆积如山,而 BCP 没有提取它们,因此我使用以下命令在 Management Studio 中进行了测试:
DECLARE @sql VARCHAR(MAX)
DECLARE @path VARCHAR(512) = 'C:\BCPFiles\'
--Use BCP to copy files in character format from the target directly into the table.
SET @sql = 'bcp [MyDB].[dbo].[MyTable] in ' + @path + 'bcpFile.dat -c -T'
EXEC master..xp_cmdshell @sql
Run Code Online (Sandbox Code Playgroud)
并收到此错误消息
使用相同的命令从同一台服务器上的命令行执行没有问题。
以下是其他一些观察结果:
EXEC master..xp_cmdshell 'dir C:\*.*'并且结果按预期返回。NT SERVICE\MSSQLSERVER 对目录具有完全控制权限。任何帮助表示赞赏。
我 在 Ubuntu (Linux) 上安装了mssql-server和mssql-tools。当我尝试使用以下命令行使用bcp命令导出数据时:
bcp DBname.dbo.Täble_Name out Täble_Name -c -k -S127.0.0.1 -Usa -PpassWord -r ~
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
SQLState = 37000,NativeError = 102
错误 = [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]'?' 附近的语法不正确。
该?是ä。
如果我Täble_Name用方括号括起来:
bcp DBname.dbo.[Täble_Name] out Täble_Name -c -k -S127.0.0.1 -Usa -PpassWord -r ~
Run Code Online (Sandbox Code Playgroud)
我在对象名称上收到此错误:
SQLState = S0002,NativeError = 208
错误 = [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]无效的对象名称“DBname.dbo.Täble_Name”。
我进一步添加了单引号''以及-q选项(启用带引号的标识符):
bcp 'DBname.dbo.[Täble_Name]' out …Run Code Online (Sandbox Code Playgroud) 通过 xp_cmdshell 使用 BCP 时出现问题。
我将表数据导出为 .dat 文件,但是当我尝试将文件导入新表时,出现以下错误。SQL Server 服务和我使用的帐户对该驱动器具有完全访问权限。我不知道为什么我仍然有问题。
错误 = [Microsoft][SQL Server Native Client 10.0] 无法打开 BCP 主机数据文件。
这是我正在运行的脚本。
exec master..xp_cmdshell 'BCP database.dbo.tabel OUT d:\tabledata.dat -T -c'
exec master..xp_cmdshell 'BCP database.dbo.tabelnew IN d:\tabledata.dat -T -c'
Run Code Online (Sandbox Code Playgroud) 使用 BCP 命令,我正在生成 SQL Server DB 表的文件。当 BCP 命令无法将数据转储到文件中时,它会为每个表创建一个空文件。这可能是由写入的查询错误或传递给 BCP 命令的空变量引起的。
有什么方法可以将这些事件捕获为错误并使其返回一些错误代码?
我正在从存储过程执行此操作。有什么办法可以在 SP 中处理这个问题吗?
我有很多大表(大约 1000 万行宽)需要定期加载到 SQL Server 2016 中以进行只读报告。我希望这些表在磁盘上尽可能小,这比加载或查询的性能改进更重要。
这是我对不需要进一步索引的表所做的工作:
DATA_COMPRESSION=PAGE. 表中的列类型是 varchar(不超过 512,不是最大值)、float、tinyint 或日期(不是日期时间)。所有列都创建为可为空的,并且没有定义主键或外键——它们与查询无关,表永远不会直接更新。一切的默认排序规则是SQL_Latin1_General_CP1_CI_AS.
当我这样做时,我可以看到sys.allocation_units该页面数据压缩已应用于堆,并且我可以看到sys.partitions填充因子正确为 0 (100%)。由于表比未压缩的表小得多,我认为压缩已完成。
但是,如果我然后使用相同的选项重建DATA_COMPRESSION=PAGE,则假定已经压缩的表会缩小大约 30%!看起来它从每个数据页大约 17 行到每页 25 行。(虽然只有一次。在那之后再次重建不会使它比第一次重建更小。)
问题
所以我的问题是:(a)这里发生了什么?(b) 有没有办法在加载表时直接获得这个超小的压缩大小,而无需在加载数据后重建?
长话短说,我们这里有一个数据库,用于管理一些员工数据,例如电子邮件、名字、姓氏等。我们公司购买了这个基于 SAP 的费用报告系统:| 这需要以非常奇怪的格式导出基于员工的数据。在不涉及太多细节的情况下,此数据的导出总共需要 137 列,其中许多列具有空值。
简单 我整理了一个查询,该查询基本上从我们的数据库中提取了这些信息,并设置了一些需要的常量。这个查询在这个问题中是什么并不相关,它只是一个SELECT提取一些数据的语句。
然后,我需要每天使用特定的文件名和管道分隔格式将其导出,效果如下:
--employee export
DECLARE @FileName varchar(500)
SET @FileName = (SELECT '\\someFileServer\Public\someFolder\employee_p06010603ace_305_202105_' + REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR(19), CONVERT(DATETIME, getdate(), 112), 126), '-', ''), 'T', ''), ':', '') + '.txt')
DECLARE @sql varchar(8000)
DECLARE @header varchar(8000)
SET @sql= 'bcp "exec [MyDBServer].[MyDbName].dbo.ConcurEmployeeExport" queryout ' + @FileName + ' -c -T -t "|"'
Exec master..xp_cmdshell @sql
Run Code Online (Sandbox Code Playgroud)
完美,我得到这样的行:
305|Jon| |Doe|10217487|10217487@t|
305|Steve| |Smith|10217522|10217522@t|
Run Code Online (Sandbox Code Playgroud)
大约有 130 多列,不想显示所有这些,因为它无关紧要。我以为我已经完成了,直到实现协调员说 yes 看起来不错,但第一行需要从这个奇怪的行开始并带有一些值。
这意味着我拥有的结果查询应该有一个额外的行,其中包含一些值......简单我以为我会联合他们想要的......所以我做到了。
除了UNION ALL我必须输入一些额外的空值来匹配我的查询中的列数。问题是当我运行导出时,我最终得到了一堆用管道分隔的空列,我最终得到了这个:
100|0|SSO|UPDATE|EN|N|N| | | | | | …Run Code Online (Sandbox Code Playgroud) 将非常大的 SQL Server 2016 结果集(超过 75 GB)转换为 CSV 文件的最佳方法是什么?工程师需要这个输出来寻找相关性。
bcp73.5 GB 文件的路由填满了 tempdb 并开始使其他应用程序崩溃,包括 ETL 进程。
我们的用户希望导出最多 500 GB。
哪个进程会使用最少的资源,以便其他应用程序继续运行?
我需要将 1.5 亿行只有 int/bigint 列从一个 SQL 实例导出到另一个。我使用 BCP queryout 导出行和 BULK INSERT 将行导入另一个表。
我将 1.5 亿行拆分为 3 个 BCP 导出文件,每个文件有 5000 万行和 3 个 BULK INSERTS。它有效(15 分钟 BCP 输出/40 分钟批量插入),但我宁愿只导出一个文件并导入一个文件。
这在技术上是可行的,还是我可能会遇到大量行的问题?我从未从 BCP 文件中导入超过 5000 万行,我不确定这如何解决。BCP 导出或导入有限制吗?
谢谢,
我希望一台服务器将数据库迁移到另一台服务器。在另一个服务器上的数据库已经存在,然后是所有的表,但它们是空的,我想填充。对于填充,我想使用 bcp - 数据库迁移。在命令行中,我写了以下内容:
bcp [dbo].[aspnet_Profile] in "c:\SQLAzureMW\BCPData\dbo.aspnet_Profile.dat" -E -n -b 10000 -a 16384 -S servername.database.windows.net -U username@servername -P "password" -d databasename!
Run Code Online (Sandbox Code Playgroud)
用户名和服务器名密码写正确。
当我运行时,我收到此错误:
错误 = 服务器不支持数据包大小更改,默认使用。
然后我将数据包大小固定为默认大小。我删除了“-a”。
bcp [dbo].[aspnet_Profile] in "c:\SQLAzureMW\BCPData\dbo.aspnet_Profile.dat" -E -n -b 10000 -S servername.database.windows.net -U username@servername -P "password" -d databasename!
Run Code Online (Sandbox Code Playgroud)
然后我收到以下错误:

谁能告诉我应该怎么做,或者有什么好的方法来移动数据库?我还使用了 SQL Azure 迁移向导,但它对我没有帮助。
bcp ×10
sql-server ×9
bulk ×1
compression ×1
csv ×1
export ×1
format ×1
insert ×1
linux ×1
migration ×1
performance ×1
permissions ×1
ubuntu ×1
xp-cmdshell ×1