SQL Server满日志问题——如何更新数据库?

发布于 2024-08-10 10:12:28 字数 247 浏览 11 评论 0原文

我正在使用 SQL Server 2000,并尝试将字段的数据类型从 varchar 更改为 nvarchar,以便它可以处理国际字符。但是,该表中已经有很多数据,当我尝试保存更改时,出现以下错误:

无法修改表。 ODBC 错误:[Microsoft][ODBC SQL Server 驱动程序][SQL Server]数据库“AppTest_Apps”的日志文件已满。备份数据库的事务日志以释放一些日志空间。

这是一次性更新——如何解决该错误?

I am working with SQL Server 2000, and trying to change the data type of a field from varchar to nvarchar, so that it can handle international characters. However, there is already a lot of data in that table, and when I try to save the change, I get the following error:

Unable to modify table.
ODBC error: [Microsoft][ODBC SQL Server Driver][SQL Server]The log file for database 'AppTest_Apps' is full. Back up the transaction log for the database to free up some log space.

This is a one-time update -- how do I get around the error?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

花期渐远 2024-08-17 10:12:28

您可能需要允许日志文件变大(请参阅日志文件上的选项),或者备份并缩小它。
http://support.microsoft.com/kb/272318

You may need to allow the log file to grow larger (see the options on the log file), or backup and shrink it.
http://support.microsoft.com/kb/272318

久伴你 2024-08-17 10:12:28

尝试运行一个事务循环来提交每 n 条记录。因此可以将当前表从 X 重命名为 Y。您可以使用此命令 sp_RENAME '[OldTableName]' , '[NewTableName]' 来执行此操作。

使用新的数据类型列集重新创建 X,然后从 Y 批量插入回 X,并提交每个循环。通过使用事务批量插入,您可以通过提交每 n 条插入的记录来控制日志增长。

伪代码

Get @max_id from Y int @max_id 
Get min_id from Y into @current_value
Loop until @current_value <= @max_id

BEGIN TRAN
INSERT INTO Y
FROM X
WHERE seq_id >= @current_value and less than @batchsize + @current_value
COMMIT TRAN

Try running a transaction loop that commits every n number of records. So could rename the current table from X to Y. You can do this with this command sp_RENAME '[OldTableName]' , '[NewTableName]'.

Recreate the X with the new datatype column set and then batch insert from Y back into X committing every loop. By inserting with transaction batch you can keep your log growth under control by committing every n number of records inserted.

Pseudo code

Get @max_id from Y int @max_id 
Get min_id from Y into @current_value
Loop until @current_value <= @max_id

BEGIN TRAN
INSERT INTO Y
FROM X
WHERE seq_id >= @current_value and less than @batchsize + @current_value
COMMIT TRAN
姜生凉生 2024-08-17 10:12:28

乍一看,我看到两种方法:

  1. 仅备份事务日志。像 BACKUP LOG dbanme TO DISK='c:\dblog.bak' 这样的操作
  2. 会将您的数据库带入简单恢复模式(例如,在企业管理器中:数据库 -> 选项 -> 恢复模式,选择简单)

At first look, I see two ways:

  1. Just backup the transaction log. Something like BACKUP LOG dbanme TO DISK='c:\dblog.bak'
  2. bring your database into SIMPLE recovery mode (e.g., in Enterprise Manager: database-> options -> recovery model, select Simple)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文