1. 程式人生 > >【SQL Server DBA】日常維護語句

【SQL Server DBA】日常維護語句

資料庫的日常維護,可以通過SQL Server中的維護計劃來自動實現,非常方便。

不過,也不是所有的維護,都可以通過維護計劃來實現,下面將通過程式碼來實現。

1、檢查資料庫完整性

dbcc checkdb(test)

通過加tablock提高速度

dbcc checkdb(test) with tablock

2、資料庫重新命名、修改恢復模式、修改使用者模式

--資料庫重新命名  
ALTER DATABASE WC  
MODIFY NAME = test 


--設定資料庫為完整恢復模式
alter database test
set recovery full


--只允許一個使用者訪問資料庫  
alter database test  
set single_user   
with rollback after 10 seconds --指定多少秒後回滾事務  
  
  
--只有sysadmin,dbcreator,db_owner角色的成員可以訪問資料庫  
alter database wc  
set restricted_user   
with rollback immediate        --立即回滾事務  
  
  
--多使用者模式 
alter database wc  
set multi_user  
with no_wait       --不等待立即改變,如不能立即完成,那麼會導致執行錯誤  


3、擴充套件資料庫:增加檔案組、增加檔案、修改檔案大小、修改檔案的邏輯名稱

--新增檔案組
ALTER DATABASE test
ADD FILEGROUP WC_FG8


--新增資料檔案
ALTER DATABASE test
ADD FILE
(
	NAME = WC_FG8,
	FILENAME = 'D:\WC_FG8.ndf',
	SIZE = 1mb,
	MAXSIZE = 10mb,
	FILEGROWTH = 1mb
)
TO FILEGROUP WC_FG8


--新增日誌檔案
ALTER DATABASE test
ADD LOG FILE
(
	NAME = WC_LOG3,
	FILENAME = 'D:\WC_FG3.LDF',
	SIZE = 1MB,
	MAXSIZE = 10MB,
	FILEGROWTH = 100KB
)


--修改資料檔案的大小,增長大小,最大大小
ALTER DATABASE test
MODIFY FILE
(
	NAME = 'WC_FG8',
	SIZE = 2MB,      --必須大於之前的大小,否則報錯
	MAXSIZE= 8MB,
	FILEGROWTH = 10%
)


--修改資料檔案或日誌檔案的邏輯名稱
ALTER DATABASE test
MODIFY FILE
(
	NAME = WC_LOG3,
	NEWNAME = WC_FG33
)

4、移動檔案
--由於在SQL Server中檔案組、檔案不能離線
--所以必須把整個資料庫設定為離線
checkpoint
go

ALTER DATABASE WC
SET OFFLINE
go


--修改檔名稱
ALTER DATABASE WC
MODIFY FILE
(
	NAME = WC_fg8,
	FILENAME = 'D:\WC\WC_FG8.NDF'
)
go


--把原來的檔案複製到新的位置:'D:\WC\WC_FG8.NDF'


--設定資料庫線上
ALTER DATABASE WC
SET ONLINE

5、設定預設檔案組、只讀檔案組

--設定預設檔案組
ALTER DATABASE WC
MODIFY FILEGROUP WC_FG8 DEFAULT


--設為只讀檔案組
--如果檔案已經是某個屬性,不能再次設定相同屬性
ALTER DATABASE WC
MODIFY FILEGROUP WC_FG8 READ_WRITE

6、收縮資料庫、收縮檔案
--收縮資料庫  
DBCC SHRINKDATABASE('test',    --要收縮的資料庫名稱或資料庫ID  
                    10         --收縮後,資料庫檔案中空間空間佔用的百分比  
                    )  
  
  
DBCC SHRINKDATABASE('test',    --要收縮的資料庫名稱或資料庫ID  
                    10,        --收縮後,資料庫檔案中空閒空間佔用的百分比  
                    NOTRUNCATE --在收縮時,通過資料移動來騰出自由空間  
                    )  
               
                      
DBCC SHRINKDATABASE('test',      --要收縮的資料庫名稱或資料庫ID  
                    10,          --收縮後,資料庫檔案中空間空間佔用的百分比  
                    TRUNCATEONLY --在收縮時,只是把檔案尾部的空閒空間釋放  
                    )  
                      
  
--收縮檔案  
DBCC SHRINKFILE(wc_fg8,   --要收縮的資料檔案邏輯名稱  
                7         --要收縮的目標大小,以MB為單位  
                )  
                  
DBCC SHRINKFILE(wc_fg8,   --要收縮的資料檔案邏輯名稱  
                EMPTYFILE --清空檔案,清空檔案後,才可以刪除檔案  
                ) 

7、刪除檔案、刪除檔案組

--要刪除檔案,必須要先把檔案上的資料刪除,或者移動到其他檔案或檔案組上
--可以清空檔案的內容
DBCC SHRINKFILE(WC_FG8,EMPTYFILE)


--刪除檔案,同時也在檔案系統底層刪除了檔案
ALTER DATABASE test
REMOVE FILE WC_FG8


--要刪除檔案組,必須先刪除所有檔案


--最後刪除檔案組
ALTER DATABASE test
REMOVE FILEGROUP WC_FG8

/*
drop database www
go

create database www
on primary
(
name = 'www_data01',
filename = 'c:\www_data01.mdf'
),
(
name = 'www_data02',
filename ='c:\www_data02.ndf'
)

log on
(
name = 'www_log',
filename = 'c:\www_log.ldf'
)
go

use www
go

create table a(id int ,v varchar(10)) on [primary]
go

insert into a
select OBJECT_ID,left(name,10) from sys.objects 
go


insert into a
select * from a
go 10


DBCC SHRINKFILE(www_data02,EMPTYFILE) 
go

ALTER DATABASE www  
REMOVE FILE www_data02 
*/

8、重新組織索引

ALTER INDEX [idx_temp_lock_id] ON [dbo].[temp_lock] 
REORGANIZE 
WITH ( LOB_COMPACTION = ON )

批量生成重組索引的語句

use test
go

select 'DBCC INDEXDEFRAG('+db_name()+','+o.name+','+i.name + ');'
        --,db_name(),
        --o.name,
        --i.name,
        --i.*

from sysindexes i
inner join sysobjects o
        on i.id = o.id
where o.xtype = 'U'
      and i.indid >0
      and charindex('WA_Sys',i.name) = 0

9、重新生成索引

ALTER INDEX [idx_temp_lock_id] ON [dbo].[temp_lock] 
REBUILD PARTITION = ALL 
WITH ( PAD_INDEX  = OFF, 
       STATISTICS_NORECOMPUTE  = OFF, 
       ALLOW_ROW_LOCKS  = ON, 
       ALLOW_PAGE_LOCKS  = ON, 
       ONLINE = OFF, 
       SORT_IN_TEMPDB = OFF )

10、更新統計資訊

--更新表中某個的統計資訊  
update statistics temp_lock(_WA_Sys_00000001_07020F21)  
  
  
update statistics temp_lock(_WA_Sys_00000001_07020F21)  
with sample 50 percent  
  
  
update statistics temp_lock(_WA_Sys_00000001_07020F21)  
with resample,    --使用最近的取樣速率更新每個統計資訊  
     norecompute  --查詢優化器將完成此統計資訊更新並禁用將來的更新  
  
  
  
--更新索引的統計資訊  
update statistics temp_lock(idx_temp_lock_id)  
with fullscan          
  
  
--更新表的所有統計資訊  
update statistics txt  
with all   

11、執行SQL Server代理作業

exec msdb.dbo.sp_start_job 
	@job_name =N'job_update_sql';

12、備份資料庫(完整、差異、日誌備份),這個在其他文章中已有詳細描述,這裡不再贅述。