某一個鏡像會話中的主庫所在服務(wù)器磁盤容量不足了,現(xiàn)要新添加一個磁盤分區(qū)用于擴(kuò)容。通常的做法是:加完分區(qū)后,添加新數(shù)據(jù)文件(或者新文件組)到新分區(qū),之后再重做鏡像。
如果此庫比較大,則重做鏡像會是件耗時和拖累性能的事情。會不會有更好的方法呢?在實際操作中,我以”數(shù)據(jù)庫文件布局方式”分為三種情況:
1. 主庫和鏡像庫的文件布局一樣,而且新增加分區(qū)盤符在兩臺機(jī)上都存在。
“一樣”指mdf/ndf和ldf文件目錄地址相同。在創(chuàng)建鏡像時,還原數(shù)據(jù)庫未指定“MOVE”則會一樣。
如主庫包含C:\DB_Test\Mirror_test_data.mdf和C:\DB_Test\Mirror_test_log.ldf,則鏡像庫的文件目錄地址也是這樣。
主機(jī)新加的分區(qū)為D,新增數(shù)據(jù)文件或文件組一樣指向D:\NewFile。鏡像機(jī)上也要有D分區(qū)。模擬代碼如下:
use master
go
CREATE DATABASE [Mirror_Test] ON PRIMARY
( NAME = N'Mirror_Test', FILENAME = N'C:\DB_Test\Mirror_test_data.mdf' , SIZE = 3072KB ,
MAXSIZE = 5120KB , FILEGROWTH = 1024KB )
LOG ON
( NAME = N'Mirror_Test_log', FILENAME = N'C:\DB_Test\Mirror_test_log.ldf' , SIZE = 5120KB ,
MAXSIZE = 10240KB , FILEGROWTH = 1024KB )
GO
use Mirror_Test
go
--每行占一頁,方便快速填充滿數(shù)據(jù)
create table tb1(id int not null,val char(8000));
go
set nocount on;
declare @i int=0,@val abc';
--不到1000行就會充滿,然后報錯
while (@i<1000)
begin
insert into tb1 values(@i,@val);
set @i=@i+1;
end
set nocount off;
go
創(chuàng)建并填充數(shù)據(jù)后,再配置鏡像。
成功添加新分區(qū)D盤(兩邊都有)后,開始添加數(shù)據(jù)文件。在兩臺機(jī)上的D盤分別創(chuàng)建了D:\NewFile目錄用于添加新文件。
<1.添加數(shù)據(jù)文件。成功添加,而且鏡像會話正常。
alter database Mirror_Test
add file( NAME = N'Mirror_Test_data2', FILENAME = N'D:\NewFile\Mirror_test_data2.ndf' , SIZE = 3072KB ,
MAXSIZE = 5120KB , FILEGROWTH = 1024KB )
to filegroup [PRIMARY]
go
<2.添加文件組。成功添加,而且鏡像會話正常。
alter database Mirror_Test add filegroup [NewFG]
go
alter database Mirror_Test
add file( NAME = N'Mirror_Test_data3', FILENAME = N'D:\NewFile\Mirror_test_data3.ndf' , SIZE = 3072KB ,
MAXSIZE = 5120KB , FILEGROWTH = 1024KB )
to filegroup [NewFG]
go
<3.添加日志文件。成功添加,而且鏡像會話正常。
alter database Mirror_Test
add log file( NAME = N'Mirror_Test_log2', FILENAME = N'D:\NewFile\Mirror_test_log2.ldf' , SIZE = 1024KB ,
MAXSIZE = 5120KB , FILEGROWTH = 1024KB)
to filegroup [PRIMARY]
go
2. 主庫和鏡像庫的文件布局不相同,而且新增加分區(qū)盤符在兩臺機(jī)上都存在。
顧名思義,文件目錄地址不同。生產(chǎn)環(huán)境中,往往是這樣的。
刪除之前的鏡像環(huán)境,主庫的創(chuàng)建跟之前的一樣,文件分布在C:\DB_Test。只是在創(chuàng)建鏡像庫時,用move選項將鏡像庫的文件還原到E:\DB_Test。
配置鏡像后,主庫文件:
鏡像庫文件:
主庫服務(wù)器成功添加新分區(qū)D盤(兩邊都有)后,開始添加數(shù)據(jù)文件。在兩臺機(jī)上的D盤分別創(chuàng)建了D:\NewFile目錄用于添加新文件。代碼跟前面的一樣。
<1.添加數(shù)據(jù)文件。成功添加,而且鏡像會話正常。
<2.添加文件組。成功添加,而且鏡像會話正常。
<3.添加日志文件。成功添加,而且鏡像會話正常。
3. 主庫和鏡像庫的文件布局不相同,而且新增加分區(qū)的盤符在鏡像機(jī)上不存在。
這是生產(chǎn)環(huán)境上最復(fù)雜的情況。
創(chuàng)建鏡像環(huán)境,主庫文件指向C:\DB_Test,鏡像庫文件指向D:\DB_Test。在主庫服務(wù)器上新增加磁盤分區(qū)E,而鏡像服器上沒有分區(qū)E。
主庫新增加數(shù)據(jù)文件指向E:\NewFile,而鏡像服務(wù)器新增數(shù)據(jù)文件將指向D:\NewFile.
<1.添加數(shù)據(jù)文件。
alter database Mirror_Test
add file( NAME = N'Mirror_Test_data2', FILENAME = N'E:\NewFile\Mirror_test_data2.ndf' , SIZE = 3072KB ,
MAXSIZE = 5120KB , FILEGROWTH = 1024KB )
to filegroup [PRIMARY]
go
執(zhí)行添加后,報錯并且數(shù)據(jù)文件沒有添加到磁盤上:
消息 1833,級別 16,狀態(tài) 2,第 1 行
只有執(zhí)行了下一個 BACKUP LOG 操作后,才能再次使用文件 'Mirror_Test_data2'。
按提示備份主庫的日志,拿到鏡像庫去還原。還原時要注意:因為鏡像服務(wù)器沒有E盤,所以還原時需要指定MOVE選項以還原到D:\NewFile.
restore log Mirror_Test
from C:\DB_Test\MTL2.bak'
with norecovery, move 'Mirror_Test_data2' D:\NewFile\DB_Test_data2.ndf'
go
仍然報錯:
消息 3104,級別 16,狀態(tài) 1,第 1 行
無法對數(shù)據(jù)庫 'Mirror_Test' 運行 RESTORE,因為已將它配置用于數(shù)據(jù)庫鏡像。如果希望還原該數(shù)據(jù)庫,則請使用 ALTER DATABASE 刪除鏡像。
也就是說,仍然要停掉鏡像會話才能恢復(fù)日志。其實停掉后,也不能恢復(fù)日志。
正確的做法是:先停止鏡像會話—>主庫添加文件—>備份主庫日志并在鏡像庫上還原—>重建鏡像會話。
<2.添加文件組。
正確的做法是:先停止鏡像會話—>主庫添加文件—>備份主庫日志并在鏡像庫上還原—>重建鏡像會話。
<3.添加日志文件。
正確的做法是:先停止鏡像會話—>主庫添加文件—>備份主庫日志并在鏡像庫上還原—>重建鏡像會話。
總結(jié)