SQLServer之附加數據庫


附加數據庫注意事項

必須首先分離數據庫。 嘗試附加未分離的數據庫將返回錯誤。 

附加數據庫時,所有數據文件(MDF 文件和 LDF 文件)都必須可用。 如果任何數據文件的路徑不同於首次創建數據庫或上次附加數據庫時的路徑,則必須指定文件的當前路徑。

在附加數據庫時,如果 MDF 和 LDF 文件位於不同目錄並且其中一條路徑包含 \\?\GlobalRoot,該操作將失敗。

需要 CREATE DATABASECREATE 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腳本附加數據庫成功后需要刷新數據庫文件夾才能查看結果。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM