镜像数据库如果主体数据库日志过大,可以在主体数据库上定时作日志备份(比如每天1次)
备份日志可以截断日志,让日志空间可以循环使用,这样可以使日志文件的大小不再增长。
具体步骤,在主体数据库上设置job,每天执行一次sql(不是镜像数据库):
BACKUP LOG 数据库名 TO DISK = 'h:\log20111122.bak'
执行完成后,日志文件大小并不会变小,只是文件使用率会下降
相关知识:
1、查看日志文件大小和使用率的sql
USE 数据库名
GO
SELECT name, data_space_id 文件组id, size/128 [文件大小(兆)],
FILEPROPERTY(name, 'SpaceUsed')/128 [已用空间(兆)],
size/128 - FILEPROPERTY(name, 'SpaceUsed')/128 [未用空间(兆)],
FILEPROPERTY(name, 'SpaceUsed')*100.0/size [使用率(%)],
max_size/128 [最大值(兆)], growth 增长值, is_percent_growth 是否百分比增长, physical_name 物理路径
FROM sys.database_files a
也可以用下面的sql查看日志文件使用率(注:要管理员才有权限,需要技术部去执行)
DBCC SQLPERF(LOGSPACE)
得到结果列如下:
Database Name Log Size (MB) Log Space Used (%)
数据库名 日志文件大小 日志文件使用率
这个使用率越小越好,备份日志后,使用率会降低,今天Newresourcedb数据库的日志变化情况:
09点 271385M 99.98%
执行日志备份,耗时3小时后变成
14点 272685M 47.93%
再执行日志备份,耗时1分钟后变成
15点 272685M 1.13%
2、镜像数据库选项的相关知识
数据库镜像概述
http://msdn.microsoft.com/zh-cn/library/ms189852.aspx异步数据库镜像(高性能模式)
http://msdn.microsoft.com/zh-cn/library/ms187110(v=SQL.90).aspx
同步数据库镜像(高安全性模式)
http://msdn.microsoft.com/zh-cn/library/ms179344(v=SQL.90).aspx
同步和异步的主要区别就是
同步时,主数据库要等镜像数据库日志也写入磁盘后,才返回告诉我们成功
而异步,则是主数据库把日志发给镜像数据库,不等镜像响应,就返回告诉我们成功
http://tech.it168.com/db/s/2007-04-24/200704240837593_2.shtml
======2012-07-18 新增 =======
-- 获取表的行数
SELECT a.id, b.[name], a.ROWS FROM sysindexes a, sys.tables b WHERE a.id = b.[object_id] AND a.indid <=1 ORDER BY b.[name]
-- 查看当前数据库日志文件大小和使用率,size以8 KB 为单位,所以除128就是MB
SELECT name, data_space_id 文件组id, size/128 [文件大小(兆)],
FILEPROPERTY(name, 'SpaceUsed')/128 [已用空间(兆)],
size/128 - FILEPROPERTY(name, 'SpaceUsed')/128 [未用空间(兆)],
FILEPROPERTY(name, 'SpaceUsed')*100.0/size [使用率(%)],
max_size/128 [最大值(兆)],
case is_percent_growth when 0 then cast(growth/128 as nvarchar) + '兆' else cast(growth as nvarchar) + '%' end 增长值,
physical_name 物理路径
FROM sys.database_files a ORDER BY a.[name]
注:Sql2005建议使用sys.database_files,sysfiles是为了兼容Sql2000才有的
前者表定义参考:http://msdn.microsoft.com/zh-cn/library/ms174397.aspx
后者兼容表定义参考:http://msdn.microsoft.com/zh-cn/library/ms178009.aspx
--查看数据库信息,如日志模式:
SELECT NAME, database_id,create_date 创建时间,is_auto_shrink_on 自动收缩, state_desc 状态,recovery_model_desc 恢复模式,is_published 是否发布库,log_reuse_wait_desc 日志重用状态 FROM sys.databases
查看日志文件使用率:
DBCC SQLPERF(LOGSPACE)
如果镜像的主体数据库日志过大,可以在主体数据库上定时作日志备份(比如1小时1次)
备份日志可以截断日志,让日志空间可以循环使用,这样可以使日志文件的大小不再增长。
BACKUP LOG newresourcedb TO DISK = 'e:\log20111122.bak'--备份完整日志
BACKUP DATABASE newresourcedb TO DISK = 'e:\db20111122.bak' with INIT--备份完整数据库
--修改数据库日志模式:Simple,Full,BULK_LOGGED
ALTER DATABASE [数据库名] SET RECOVERY SIMPLE
--设置自动收缩
ALTER DATABASE [数据库名] SET AUTO_SHRINK ON WITH NO_WAIT
-- 查看当前数据库总大小
SELECT sum(size)/128 [文件(兆)] FROM sys.database_files
-- 查看所有数据库大小
if exists (select 1 from sys.tables where name='tb1')
drop table tb1;
SELECT *, GETDATE() dt, ' ' tbname into tb1 FROM sys.database_files where 1=2
EXECUTE sp_msforeachdb 'INSERT INTO tb1 SELECT *, GETDATE(),''?'' FROM [?].sys.database_files'
select tbname, sum(size)/128 [大小(M)] from tb1 group by tbname order by [大小(M)] desc
--sp_msforeachdb是循环所有数据库,把数据库名替换掉脚本里的?