某一个镜像会话中的主库所在服务器磁盘容量不足了,现要新添加一个磁盘分区用于扩容。通常的做法是:加完分区后,添加新数据文件(或者新文件组)到新分区,之后再重做镜像。
如果此库比较大,则重做镜像会是件耗时和拖累性能的事情。会不会有更好的方法呢?在实际操作中,我以”数据库文件布局方式”分为三种情况:
1. 主库和镜像库的文件布局一样,而且新增加分区盘符在两台机上都存在。
“一样”指mdf/ndf和ldf文件目录地址相同。在创建镜像时,还原数据库未指定“MOVE”则会一样。
如主库包含C:\DB_Test\Mirror_test_data.mdf和C:\DB_Test\Mirror_test_log.ldf,则镜像库的文件目录地址也是这样。
主机新加的分区为D,新增数据文件或文件组一样指向D:\NewFile。镜像机上也要有D分区。模拟代码如下:
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
--每行占一页,方便快速填充满数据
create table tb1(id int not null,val char(8000));
go
set nocount on;
declare @i int=0,@val char(8000)='abc';
--不到1000行就会充满,然后报错
while (@i<1000)
begin
insert into tb1 values(@i,@val);
set @i=@i+1;
end
set nocount off;
go
创建并填充数据后,再配置镜像。
成功添加新分区D盘(两边都有)后,开始添加
select b.name as tablename ,
c.row_count as datacount
from sys.indexes a ,
sys.objects b ,
sys.dm_db_partition_stats c
where a.[object_id] = b.[object_id]
AND b.[object_id] = c.[object_id]
AND a.index_id = c.index_id
AND a.index_id < 2
AND b.is_ms_shipped = 0
--方法二
select b.name as tablename ,
a.rowcnt as datacount
from sysindexes a ,
sysobjects b
where a.id = b.id
and a.indid < 2
and objectproperty(b.id, 'IsMSShipped') = 0
本文链接
最近项目需要做什么数据字典,需要表结构信息。在网上看了许多关于表结构信息的查询,感觉都不怎么样。相对好一点就是SQL2005 SQL2008 表结构信息查询升级版(含外键信息) ,但是这里有一点小问题,缺少一个过滤以致运行有一点小bug。在AdventureWorks2012数据库中的Address表查询结果如图:
在查询过滤中我们添加以下信息就ok了:
AND g.class_desc = 'OBJECT_OR_COLUMN'
修改后的SQL如下:
ELSE ''
END ,
表说明 = CASE WHEN a.colorder = 1 THEN ISNULL(f.value, '')
ELSE ''
END ,
字段序号 = a.colorder ,
字段名 = a.name ,
标识 = CASE WHEN COLUMNPROPERTY(a.id, a.name, 'IsIdentity') = 1 THEN '√'
ELSE ''
END ,
主键 = CASE WHEN EXISTS ( SELECT 1
FROM dbo.sysindexes si
INNER JOIN dbo.sysindexkeys sik ON si.id = sik.id
AND si.indid = sik.indid
INNER JOIN dbo.syscolumns sc ON sc.id = sik.id
AND sc.colid = sik.colid
INNER JOIN dbo.sysobjects so ON so.name = so.name
AND so.xtype = 'PK'
WHERE sc.id = a.id
AND sc.colid = a.colid ) THEN '√'
ELSE ''
END ,
外键 = CASE WHEN tony.fkey IS NOT NULL
AND tony.fkey = a.colid THEN '√'
ELSE ''
END ,
外键表 = CASE WHEN tony.fkey IS NOT NULL
AND tony.fkey = a.colid THEN OBJECT_NAME(tony.fkeyid)
ELSE ''
END ,
外键字段 = CASE WHEN tony.fkey IS NOT NULL
AND tony.fkey = a.colid
THEN ( SELECT name
FROM syscolumns
WHERE colid = tony.fkey
AND id = tony.fkeyid
)
ELSE ''
END ,
类型 = b.name ,
长度 = a.length ,
精度 = COLUMNPROPERTY(a.id, a.name, 'PRECISION') ,
小数位数 = ISNULL(COLUMNPROPERTY(a.id, a.name, 'Scale'), 0) ,
允许空 = CASE WHEN a.isnullable = 1 THEN '√