Проблема с полным журналом SQL Server, как обновить базу данных?

Я работаю с SQL Server 2000 и пытаюсь изменить тип данных поля с varchar на nvarchar, чтобы он мог обрабатывать международные символы. Однако в этой таблице уже есть много данных, и когда я пытаюсь сохранить изменение, я получаю следующую ошибку:

Невозможно изменить таблицу. Ошибка ODBC: [Microsoft] [Драйвер ODBC SQL Server] [SQL Server] Файл журнала для базы данных «AppTest_Apps» заполнен. Создайте резервную копию журнала транзакций для базы данных, чтобы освободить место для журнала.

Это разовое обновление - как мне обойти ошибку?


person twpc    schedule 06.11.2009    source источник


Ответы (3)


Возможно, вам потребуется разрешить файл журнала увеличиться (см. Параметры в файле журнала) или сделать резервную копию и сжать его. http://support.microsoft.com/kb/272318

person KiwiNige    schedule 06.11.2009

Попробуйте запустить цикл транзакции, который фиксирует каждые 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
person Kuberchaun    schedule 06.11.2009
comment
Или сделайте так, как говорит KiwiNige. Если у вас есть место на диске, увеличьте журнал для этого одноразового события, а затем уменьшите его размер. Это было бы проще всего, если бы меньше думать. Но если ваше дисковое пространство является проблемой, вставка пакетного цикла подойдет вам. - person Kuberchaun; 06.11.2009

На первый взгляд я вижу два пути:

  1. Просто сделайте резервную копию журнала транзакций. Что-то вроде BACKUP LOG dbanme TO DISK = 'c: \ dblog.bak'
  2. переведите базу данных в ПРОСТОЙ режим восстановления (например, в Enterprise Manager: база данных-> параметры -> модель восстановления выберите Простой)
person Alex_L    schedule 06.11.2009