5

私はこれが初めてです。2 つの .ldf ファイルを持つデータベース (他の人によって作成されたもの) があります。(blah_log.ldf および blah_log2.ldf)。マネージャーからログ ファイルの 1 つを削除するように依頼されましたが、削除できません。どうすればいいですか?別のサーバーに配置、デタッチ、ログ ファイルの削除、アタッチを試みましたが、エラーが発生します。そうすれば片方だけになると思っていたのに、両方欲しかった。次に、プロパティを右クリックしてファイルを削除しようとしましたが、削除できませんでした。ログファイルが空ではないと言われました。どうすればこれを達成できますか。dang データベースに 2 つではなく 1 つのおかしなログ ファイルがある場所を作成したいだけです。これはそれほど複雑ではないはずです。私は初心者で何も知らないので、そうではないかもしれません。助けてください!

私はちょうどこれを試しました: 空の SQL Server データベース トランザクション ログ ファイル

バックアップ ログ [dbname] with truncate_only go DBCC SHRINKDATABASE ([dbname], 10, TRUNCATEONLY) go

次に、2 番目のログ ファイルを削除し、[OK] をクリックしました。私はこれが私がする必要があるすべてだと思いますか?復元からテストサーバーで試しました。

4

1 に答える 1

5

この MSDN の記事では、これを高レベルで達成する方法について説明しています

トランザクション ログ データをあるログ ファイルから別のログ ファイルに移動して、トランザクション ログ ファイルを空にすることはできません。非アクティブなトランザクションをトランザクション ログ ファイルから削除するには、トランザクション ログを切り捨てるかバックアップする必要があります。トランザクション ログ ファイルにアクティブまたは非アクティブなトランザクションが含まれなくなったら、ログ ファイルをデータベースから削除できます。

そして、このブログ投稿は、このタスクを実行する実際の T-SQL を示しています

USE master 
IF DB_ID('rDb') IS NOT NULL DROP DATABASE rDb 
GO 

CREATE DATABASE rDb 
ON  
PRIMARY  
 ( NAME = N'rDb', FILENAME = N'C:\rDb.mdf' , SIZE = 50MB , 
     FILEGROWTH = 1024KB ) 
LOG ON  
 (NAME = N'rDb_log2', FILENAME = N'C:\rDb_log2.ldf', SIZE = 3MB, 
     FILEGROWTH = 2MB) 
,(NAME = N'rDb_log3', FILENAME = N'C:\rDb_log3.ldf', SIZE = 3MB, 
     FILEGROWTH = 2MB) 
,(NAME = N'rDb_log4', FILENAME = N'C:\rDb_log4.ldf', SIZE = 3MB, 
     FILEGROWTH = 2MB) 
GO 

ALTER DATABASE rDb SET RECOVERY FULL 
BACKUP DATABASE rDb TO DISK = 'C:\rDb.bak' WITH INIT 
CREATE TABLE rDb..t(c1 INT IDENTITY, c2 CHAR(100)) 

INSERT INTO rDb..t 
SELECT TOP(15000) 'hello' 
FROM syscolumns AS a 
  CROSS JOIN syscolumns AS b 

--Log is now about 46% full 
DBCC SQLPERF(logspace) 

--Check virtual log file layout 
DBCC LOGINFO(rDb) 
--See that file 4 isn't used at all (Status = 0 for all 4's rows) 

--We can remove file 4, it isn't used 
ALTER DATABASE rDb REMOVE FILE rDb_log4 

--Check virtual log file layout 
DBCC LOGINFO(rDb) 

--Can't remove 3 since it is in use 
ALTER DATABASE rDb REMOVE FILE rDb_log3 

--What if we backup log? 
BACKUP LOG rDb TO DISK = 'C:\rDb.bak' 

--Check virtual log file layout 
DBCC LOGINFO(rDb) 
--3 is still in use (status = 2) 

--Can't remove 3 since it is in use 
ALTER DATABASE rDb REMOVE FILE rDb_log3 

--Shrink 3 
USE rDb 
DBCC SHRINKFILE(rDb_log3) 
USE master 

--... and backup log? 
BACKUP LOG rDb TO DISK = 'C:\rDb.bak' 

--Check virtual log file layout 
DBCC LOGINFO(rDb) 
--3 is no longer in use 

--Can now remove 3 since it is not in use 
ALTER DATABASE rDb REMOVE FILE rDb_log3 

--Check explorer, we're down to 1 log file 

--See what sys.database_files say? 
SELECT * FROM rDb.sys.database_files 
--Seems physical file is gone, but SQL Server consider the file offline 

--Backup log does it: 
BACKUP LOG rDb TO DISK = 'C:\rDb.bak' 
SELECT * FROM rDb.sys.database_files 

--Can never remove the first ("primary") log file 
ALTER DATABASE rDb REMOVE FILE rDb_log2 
--Note error message from above
于 2012-05-31T18:50:09.107 に答える