附加資料庫註意事項 必須首先分離資料庫。 嘗試附加未分離的資料庫將返回錯誤。 附加資料庫時,所有數據文件(MDF 文件和 LDF 文件)都必須可用。 如果任何數據文件的路徑不同於首次創建資料庫或上次附加資料庫時的路徑,則必須指定文件的當前路徑。 在附加資料庫時,如果 MDF 和 LDF 文件位於不同 ...
附加資料庫註意事項
必須首先分離資料庫。 嘗試附加未分離的資料庫將返回錯誤。
附加資料庫時,所有數據文件(MDF 文件和 LDF 文件)都必須可用。 如果任何數據文件的路徑不同於首次創建資料庫或上次附加資料庫時的路徑,則必須指定文件的當前路徑。
在附加資料庫時,如果 MDF 和 LDF 文件位於不同目錄並且其中一條路徑包含 \\?\GlobalRoot,該操作將失敗。
需要 CREATE DATABASE
、CREATE ANY DATABASE
或 ALTER ANY DATABASE
許可權。
分離再重新附加只讀資料庫後,會丟失有關當前差異基準的備份信息。 “差異基準” 是資料庫或其文件或文件組子集中所有數據的最新完整備份。 如果沒有基準備份信息,master 資料庫會變得與只讀資料庫不同步,這樣之後進行的差異備份可能會產生意外結果。 因此,如果對只讀資料庫使用差異備份,在重新附加資料庫後,應通過進行完整備份來建立新的差異基準。
附加時,資料庫會啟動。 通常,附加資料庫時會將資料庫重置為它分離或複製時的狀態。 但是,附加和分離操作都會禁用資料庫的跨資料庫所有權鏈接。
附加日誌文件的要求在某些方面取決於資料庫是讀寫的還是只讀的,如下所示:
-
對於讀寫資料庫,通常可以附加新位置中的日誌文件。 不過,在某些情況下,重新附加資料庫需要使用其現有的日誌文件。 因此,請務必保留所有分離的日誌文件,直到在不需要這些日誌文件的情況下成功附加了資料庫。
如果讀寫資料庫具有單個日誌文件,並且您沒有為該日誌文件指定新位置,附加操作將在舊位置中查找該文件。 如果找到了舊日誌文件,則無論資料庫上次是否完全關閉,都將使用該文件。 但是,如果未找到舊文件日誌,資料庫上次是完全關閉且現在沒有活動日誌鏈,則附加操作將嘗試為資料庫創建新的日誌文件。
-
如果附加的主數據文件是只讀的,則 資料庫引擎 假定資料庫也是只讀的。 對於只讀資料庫,日誌文件在資料庫主文件中指定的位置上必須可用。 因為 SQL Server 無法更新主文件中存儲的日誌位置,所以無法生成新的日誌文件。
使用SSMS資料庫管理工具附加資料庫
1、連接伺服器-》在對象資源管理器視窗展開資料庫文件夾-》右鍵點擊資料庫文件夾-》選擇附加。
2、在附加資料庫彈出框-》點擊添加(查找必需的主資料庫文件。 當用戶選擇 .mdf 文件時,就會在 “要附加的資料庫” 網格的相應欄位中自動填充合適的信息。)。
3、在定位資料庫文件彈出框中-》選擇指定路徑下分離的資料庫文件-》點擊確定。
4、在附加資料庫彈出框-》要附加的資料庫窗格(顯示所選資料庫的有關信息。):MDF 文件位置(顯示選定 MDF 文件的路徑和文件名。);資料庫名稱(顯示資料庫的名稱。);附加為(根據需要,可以指定要附加資料庫的其他名稱。);“所有者”(提供資料庫可能所有者的下拉列表,您可以根據需要從其中選擇其他所有者。);“狀態”(顯示下表中相應的資料庫狀態。),狀態一圖標為無圖標,狀態文本為無文本,描述為此對象的附加操作尚未啟動或者可能掛起。 這是打開該對話框時的預設值;狀態二圖標為綠色的右向三角形,狀態文本為正在進行,描述為已啟動附加操作,但是該操作未完成;狀態三圖標為綠色的選中標記,狀態文本為成功,描述為已成功附加該對象;狀態四圖標為包含白色十字形的紅色圓圈,狀態文本為錯誤,描述為附加操作遇到錯誤,未成功完成;狀態五圖標為包含左、右兩個黑色象限和上、下兩個白色象限的圓圈,狀態文本為已停止,描述為由於用戶停止了附加操作,該操作未成功完成;狀態六圖標為包含一個指向逆時針方向的曲線箭頭的圓圈,狀態文本為已回滾,狀態描述為附加操作已成功,但已對其進行回滾,因為在附加其他對象的過程中出現了錯誤。-》刪除(從 “要附加的資料庫” 網格中刪除選定文件。)-》資料庫詳細信息窗格:原始文件名(顯示屬於資料庫的已附加文件的名稱。);文件類型(指示文件類型,即 “數據” 或 “日誌”。);當前文件路徑(顯示所選資料庫文件的路徑。 可以手動編輯該路徑。);消息(顯示空消息或 “找不到文件” 超鏈接。)-》點擊確定。
5、查看附加結果(不需要刷新即可在對象資源管理器視窗查看)。
使用T-SQL腳本附加資料庫
語法
--語法一
--聲明資料庫引用
use other_database_name;
go
--附加資料庫
create database database_name
on (filename='mdf_path'),
(filename='ldf_path')
for attach
go
--語法二
--聲明資料庫引用
use other_database_name;
go
--附加資料庫
create database database_name
on (
name='logical_file_name'
,filename='filestream_path'
,size= size_number [ KB | MB | GB | TB ]
,maxsize= { max_size_number [ KB | MB | GB | TB ] | unlimited }
,filegrowth= growth_increment [ KB | MB | GB | TB | % ]
),
(
name='logical_log_file_name'
filename='log_filestream_path'
,size= size_number [ KB | MB | GB | TB ]
,maxsize= { max_size_number [ KB | MB | GB | TB ] | unlimited }
,filegrowth= growth_increment [ KB | MB | GB | TB | % ]
)
for { attach with
[ enable_broker | new_broker | error_broker_conversations ]
[,restricted_user]
[,filestream ( directory_name={ 'directory_name' | NULL })]
| attach_rebuild_log }
go
語法解析
--語法解析
--other_database_name
--其它資料庫,不能使用要附加的資料庫進行附加。
--database_name
--新資料庫的名稱。資料庫名稱在SQL Server的實例中必須唯一,並且必須符合標識符規則。
--mdf_path
--資料庫分離的數據文件完整路徑。
--ldf_path
--資料庫分離的日誌文件完整路徑。
--name
--指定文件的邏輯名稱。 指定filename時,
--需要使用name,除非指定for attach子句之一。 無法將filestream文件組命名為primary。
--logical_file_name
--在SQL Server中引用文件時所用的邏輯名稱。 Logical_file_name在資料庫中必須唯一,並且必須符合標識符規則。
--名稱可以是字元或Unicode常量,也可以是常規標識符或分隔標識符。
--filename
--指定操作系統(物理)文件名稱。
--filestream_path
--資料庫數據文件完整路徑
--logical_log_file_name
--資料庫日誌名稱。
--log_filestream_path
--資料庫日誌文件完整路徑
--size
--指定文件的大小。
--將 os_file_name 指定為UNC路徑時,不能指定SIZE。 SIZE不適用於FILESTREAM文件組。
--size_number
--文件的初始大小。
--maxsize
--指定文件可增大到的最大大小。將os_file_name指定為UNC路徑時,不能指定maxsize。
--max_size_number
--最大的文件大小。可以使用 KB、MB、GB 和 TB 尾碼。預設值為 MB。指定一個整數,不包含小數位。
--如果未指定 max_size,文件將一直增長到磁碟變滿為止。Max_size 是一個整數值。對於大於2147483647的值,使用更大的單位。
--unlimited
--指定文件將增長到磁碟充滿。在SQL Server中,指定為不限制增長的日誌文件的最大大小為2TB,而數據文件的最大大小為16TB。
--filegrowth
--指定文件的自動增量。文件的filegrowth設置不能超過max_size_number設置。將os_file_name指定為UNC路徑時,不能指定filegrowth。
--filegrowth不適用於filestream文件組。
--growth_increment
--每次需要新空間時為文件添加的空間量。
--該值可以MB、KB、GB、TB 或百分比 (%)為單位指定。
--如果未在數量後面指定MB、KB 或%,則預設值為MB。
--如果指定%,則增量大小為發生增長時文件大小的指定百分比。 定的大小舍入為最接近的64KB的倍數,最小值為64KB。
--值為0時表明自動增長被設置為關閉,不允許增加空間。
--enable_broker
--指定對指定的資料庫啟用Service Broker。 也就是說,啟動了消息傳遞,
--並且在sys.databases 目錄視圖中將is_broker_enabled設置為true。資料庫保留現有的Service Broker標識符。
--new_broker
--在sys.databases和還原資料庫中都創建一個新的service_broker_guid值,並通過清除結束所有會話端點。
--Broker已啟用,但未向遠程會話端點發送消息。必須使用新標識符重新創建任何引用舊Service Broker標識符的路由。
--error_broker_conversations
--結束所有會話,並產生一個錯誤指出資料庫已附加或還原。
--Broker一直處於禁用狀態直到此操作完成,然後再將其啟用。資料庫保留現有的Service Broker標識符。
--restricted_user
--對於attach,可以指定restricted_user選項。
--restricted_user只允許db_owner固定資料庫角色成員以及dbcreator和sysadmin固定伺服器角色成員連接到資料庫,
--不過對連接數沒有限制。無資格用戶的嘗試將被拒絕。
--filestream
--將包含filestream選項“目錄名稱”的資料庫附加到SQL Server實例中將提示SQL Server驗證Database_Directory名稱是否唯一。
--directory_name={ 'directory_name' | NULL }
--適用於: SQL Server 2012 (11.x) 到 SQL Server 2017
--與Windows相容的目錄名稱。此名稱應在SQL Server實例的所有Database_Directory名稱中唯一。
--無論SQL Server排序規則設置如何,唯一性比較都不區分大小寫。在此資料庫中創建FileTable之前,應設置此選項。
--僅在將containment設置為partial之後,才允許使用以下選項。如果將containment設置為none,將發生錯誤。
--for attach_rebuild_log
--指定通過附加一組現有的操作系統文件來創建資料庫。該選項只限於讀/寫資料庫。
--必須有一個指定主文件的 <filespec> 項。如果缺少一個或多個事務日誌文件,將重新生成日誌文件。
--attach_rebuild_log自動創建一個新的1MB的日誌文件。此文件放置於預設的日誌文件位置。
--for attach_rebuild_log具有以下要求:完全關閉資料庫。所有數據文件(MDF 和 NDF)都必須可用。
--通常,FOR ATTACH_REBUILD_LOG 用於將具有大型日誌的可讀/寫資料庫複製到另一臺伺服器,
--在這台伺服器上,資料庫副本頻繁使用,或僅用於讀操作,因而所需的日誌空間少於原始資料庫。
--不能對資料庫快照指定for attach_rebuild_log。
示例
--示例一
--聲明資料庫引用
use master;
go
--附加資料庫
create database testss
on (filename='D:\SQLServer\tests.mdf'),
(filename='D:\SQLServer\testslog.ldf')
for attach
go
--示例二
--聲明資料庫引用
use master;
go
--附加資料庫
create database testss
on (
name='testss'
,filename='D:\SQLServer\tests.mdf'
,size=1021KB
,maxsize=1024MB
,filegrowth=1024MB
),
(
name='testsslog'
,filename='D:\SQLServer\testslog.ldf'
,size=1021KB
,maxsize=1024MB
,filegrowth=1024MB
)
for attach
with
enable_broker
,restricted_user
--,filestream ( directory_name='D:\SQLServer\')
go
示例結果:使用T-SQL腳本附加資料庫成功後需要刷新資料庫文件夾才能查看結果。