SQLServer之附加數據庫

附加數據庫注意事項

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

附加數據庫時,全部數據文件(MDF 文件和 LDF 文件)都必須可用。 若是任何數據文件的路徑不一樣於首次建立數據庫或上次附加數據庫時的路徑,則必須指定文件的當前路徑。服務器

在附加數據庫時,若是 MDF 和 LDF 文件位於不一樣目錄而且其中一條路徑包含 \?GlobalRoot,該操做將失敗。工具

須要 CREATE DATABASE、CREATE ANY DATABASE 或 ALTER ANY DATABASE 權限。ui

分離再從新附加只讀數據庫後,會丟失有關當前差別基準的備份信息。 「差別基準」 是數據庫或其文件或文件組子集中全部數據的最新完整備份。 若是沒有基準備份信息,master 數據庫會變得與只讀數據庫不一樣步,這樣以後進行的差別備份可能會產生意外結果。 所以,若是對只讀數據庫使用差別備份,在從新附加數據庫後,應經過進行完整備份來創建新的差別基準。spa

附加時,數據庫會啓動。 一般,附加數據庫時會將數據庫重置爲它分離或複製時的狀態。 可是,附加和分離操做都會禁用數據庫的跨數據庫全部權連接。操作系統

附加日誌文件的要求在某些方面取決於數據庫是讀寫的仍是隻讀的,以下所示:3d

對於讀寫數據庫,一般能夠附加新位置中的日誌文件。 不過,在某些狀況下,從新附加數據庫須要使用其現有的日誌文件。 所以,請務必保留全部分離的日誌文件,直到在不須要這些日誌文件的狀況下成功附加了數據庫。rest

若是讀寫數據庫具備單個日誌文件,而且您沒有爲該日誌文件指定新位置,附加操做將在舊位置中查找該文件。 若是找到了舊日誌文件,則不管數據庫上次是否徹底關閉,都將使用該文件。 可是,若是未找到舊文件日誌,數據庫上次是徹底關閉且如今沒有活動日誌鏈,則附加操做將嘗試爲數據庫建立新的日誌文件。日誌

若是附加的主數據文件是隻讀的,則 數據庫引擎 假定數據庫也是隻讀的。 對於只讀數據庫,日誌文件在數據庫主文件中指定的位置上必須可用。 由於 SQL Server 沒法更新主文件中存儲的日誌位置,因此沒法生成新的日誌文件。code

使用SSMS數據庫管理工具附加數據庫

一、鏈接服務器-》在對象資源管理器窗口展開數據庫文件夾-》右鍵點擊數據庫文件夾-》選擇附加。

clipboard.png

二、在附加數據庫彈出框-》點擊添加(查找必需的主數據庫文件。 當用戶選擇 .mdf 文件時,就會在 「要附加的數據庫」 網格的相應字段中自動填充合適的信息。)。

clipboard.png

三、在定位數據庫文件彈出框中-》選擇指定路徑下分離的數據庫文件-》點擊肯定。

clipboard.png

四、在附加數據庫彈出框-》要附加的數據庫窗格(顯示所選數據庫的有關信息。):MDF 文件位置(顯示選定 MDF 文件的路徑和文件名。);數據庫名稱(顯示數據庫的名稱。);附加爲(根據須要,能夠指定要附加數據庫的其餘名稱。);「全部者」(提供數據庫可能全部者的下拉列表,您能夠根據須要從其中選擇其餘全部者。);「狀態」(顯示下表中相應的數據庫狀態。),狀態一圖標爲無圖標,狀態文本爲無文本,描述爲此對象的附加操做還沒有啓動或者可能掛起。 這是打開該對話框時的默認值;狀態二圖標爲綠色的右向三角形,狀態文本爲正在進行,描述爲已啓動附加操做,可是該操做未完成;狀態三圖標爲綠色的選中標記,狀態文本爲成功,描述爲已成功附加該對象;狀態四圖標爲包含白色十字形的紅色圓圈,狀態文本爲錯誤,描述爲附加操做遇到錯誤,未成功完成;狀態五圖標爲包含左、右兩個黑色象限和上、下兩個白色象限的圓圈,狀態文本爲已中止,描述爲因爲用戶中止了附加操做,該操做未成功完成;狀態六圖標爲包含一個指向逆時針方向的曲線箭頭的圓圈,狀態文本爲已回滾,狀態描述爲附加操做已成功,但已對其進行回滾,由於在附加其餘對象的過程當中出現了錯誤。-》刪除(從 「要附加的數據庫」 網格中刪除選定文件。)-》數據庫詳細信息窗格:原始文件名(顯示屬於數據庫的已附加文件的名稱。);文件類型(指示文件類型,即 「數據」 或 「日誌」。);當前文件路徑(顯示所選數據庫文件的路徑。 能夠手動編輯該路徑。);消息(顯示空消息或 「找不到文件」 超連接。)-》點擊肯定。

clipboard.png

五、查看附加結果(不須要刷新便可在對象資源管理器窗口查看)。

clipboard.png

使用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腳本附加數據庫成功後須要刷新數據庫文件夾才能查看結果。

clipboard.png

相關文章
相關標籤/搜索