posts - 557, comments - 7267, trackbacks - 375, articles - 9
  博客园 :: 首页 :: 新随笔 :: 订阅 订阅 :: 管理

公告

sqlserver数据库维护脚本大全,值得收藏

Posted on 2014-09-28 09:36 天轰穿 阅读(...) 评论(...) 编辑 收藏

下面的代码非但有图文,简直是视频,地址
http://www.cnthc.com/?/article/67
http://www.cnthc.com/?/article/73

--创建一个玩的数据库
Create database Stu_db2
go

--查看数据库
--1、通过图形化界面查看,所有的选项的解释 http://www.cnthc.com/?/explore/category-9 注意看《数据库选项》这个话题
--2、通过系统内置函数DATABASEPROPERTYEX   具体可用属性查询地址 http://www.cnthc.com/?/article/29
--语法: DATABASEPROPERTYEX(目标数据库名, 属性),例:
select DATABASEPROPERTYEX('Stu_db2','isautoshrink')

--说数据库文件如果不**的话就会无**的增加到把磁盘撑满,这个有什么办法可以看到目前数据库文件的大小?
--可以执行内置存储过程 sp_spaceused来获取数据库大小,例:
use Stu_db2
go
exec sp_spaceused

--有不有什么办法可以连数据库的文件在那里,文件的上限、增量等都显示出来呢?
--使用系统内置存储过程 sp_helpdb + 要查看的数据库名
exec sp_helpdb Stu_db2

--删除数据库
drop database Stu_db2
--错误信息都提示得很明白了嘛,你当前正在使用这个数据库,这就好比你躺在床上,却执行把床扔了的动作一样
--若要使用 DROP DATABASE,则连接的数据库上下文不能与要删除的数据库或数据库快照,例:
use master
go
drop database Stu_db2

--如果是图形化界面操作,则需要把最下面有个“关闭现有连接”给勾选上

--为了不影响练习,再新建一个
create database Stu_db2

--修改数据库名,如果要通过SSMS直接修改,要确保没有任何用户正在使用数据库
alter database Stu_db2
modify name=Stu_db3

--如果需要一个霸占当前数据库,这可以设置数据库为单用户模式,用图形界面修改,在“数据库属性”对话框中,单击“选项”页。在“**访问”选项中,选择“SINGLE_USER”。
--这个时候如果其他用户连接到数据库,将出现“打开的连接”消息。若要更改属性并关闭所有其他连接,请单击“是”,代码则如下
ALTER DATABASE Stu_db3
SET  SINGLE_USER WITH NO_WAIT     --等待所有事务执行完成,再把数据库设置为单用户,不足是显而易见的,就是一直等待事务完成

--多用户模式的关键字  MULTI_USER
ALTER DATABASE Stu_db3
SET  MULTI_USER WITH NO_WAIT


--扩展数据库
--第一:设置数据库为自动增长方式;
--第二:增加数据库中数据文件和日志文件的大小,就是修改它们的MAXSIZE属性;
--第三:就是为数据库增加新的次要数据文件或日志文件。
--最优选择为数据库增加次要数据或者日志文件,我们执行如下T-SQL语句
use master
go
alter database Stu_db3      --指定要修改的数据库
add file                    --增加数据文件
    (name=Stu_db3_a,    --文件在数据库中的名字,
    filename='e:\Stu_db3_a.ndf',--文件路径和在文件系统中的名字
    size=2MB,               --文件初始大小
    maxsize=unlimited,  --文件上限
    filegrowth=10%      --增量
    )
go

alter database Stu_db3       
add log file          --增加日志文件
        (name=Stu_db3_a_log,
        filename='e:\Stu_db3_a.ldf',
        size=10MB,
        maxsize=20mb,
        filegrowth=5%
        )
go

--查看修改的结果
exec sp_helpdb Stu_db3

--单纯修改文件的大小和增量
use master
go
alter database Stu_db3  --要修改的数据库
modify file(    
name=Stu_db3_a              --要修改的文件逻辑名
,size=20                --文件大小
,filegrowth=10%     --增量
)
go

/*--收缩数据库
比如我们一次把系统中10年前的数据全部删除或者转移了,只保留最近三年的,那么数据库必然会空出很多空间。
还有种情况,是设计数据库的时候因为某种原因,设计得很大,后来发现用不上或者必须收缩。
处理方式也有四种:
第一种,图形界面上操作,在“对象资源管理器->指定服务器实例->数据库->指定的数据库上面右键->任务->收缩
第一种是设置数据库为自动收缩,通过设置AUTO_SHRINK数据库选项实现;不建议这样做,反复收缩会增加数据库的碎片
*/
alter database Stu_db3
set auto_shrink on

--第二种是通过手动的执行DBCC SHRINKDATABASE 语句来收缩整个数据库的大小;
--语法 :DBCC SHRINKDATABASE(‘要收缩的数据库名’,可用空间的比例)
DBCC SHRINKDATABASE('Stu_db3',20)  --收缩上面多次用到的数据库OneDb_bak,只给他留下20%的可用空间

--如果收缩当前使用的数据库,可用0代表数据库名,例如
use Stu_db3
go
DBCC SHRINKDATABASE(0,20)    

--你无聊的话可以试试反复执行,看看是什么提示

--第三种执行 DBCC SHRINKFILE 语句来手动收缩数据库中的文件的大小。
--语法:DBCC SHRINKFILE(‘文件逻辑名’,收缩后的大小),如果未指定收缩后的大小则缩到默认大小
use Stu_db3
go
DBCC SHRINKFILE('Stu_db3_a',20)   --指定收缩数据中逻辑名为one的文件

/*--=============数据库快照(感兴趣的可以在网上搜索下数据库快照原理)--------
快照就是将当前数据库原样的复制一个只读的数据源出来。它是当前数据库的只读静态视图,不包括那些还没有提交的事务
用处:可以作为数据源进行数据查询,分析,如果元数据库坏了,这个还可以还原(当然,不建议用这个作为安全保证)
使用场景:假设我们对某企业内部办公系统进行大量的分析,最好的做法是将目前的数据库备份到另外一个数据库服务器上来分析。
初期无所谓,但是如果将来这个数据库很大了,备份的操作可能很容易引起系统崩溃。 而数据库快照则可以很好的解决这个问题。
管理数据库快照
*/
--例如我们为数据库Stu_db2创建一个名为Test_20140926的快照 如下
--数据库中只有默认的一个数据文件一个日志文件的情况下
create database Tets  
GO
USE master
GO
CREATE DATABASE Tets_20140926   --快照名
ON (        
NAME=Tets    --源数据库文件的逻辑名                    
,FILENAME='e:\Tets_20140926.thc'     --快照文件存放位置和文件名,文件后缀名随便  
)   
    --指明为那个数据库创建快照
AS SNAPSHOT OF Tets                   
GO

--多个数据库文件的快照创建,有多少个数据文件就必须指定多少次,日志文件不能做快照
create database Stu_db3_snp --创建快照的名称
on(                         --第一个数据库文件
name=Stu_db2,           --逻辑文件名为aaaa的数据文件
filename='e:\st_1.thc'  --快照文件物理路径
),                          --继续第二个
(   
name=Stu_db3_a,         --逻辑文件名为test2的数据文件
filename='e:\st_2.thc'  --快照文件物理路径
)
as snapshot of Stu_db3     --源数据库为test2

--留个作业,你把删除快照的脚本写出来

--如果你会insert语句和select语句的话,赶紧试试,对你的快照进行查询和写入的操作,看看后果是什么
--要操作的话,你把快照当数据库就行了,还是use 快照名,然后就是你的操作了

--恢复快照到数据库(再说一句,不推荐这样做,因为我们有更好的备份还原策略)
--恢复    数据库  test2 来自 数据库_快照      = 快照名
restore database Tets from database_snapshot='Tets_20140926'

/*--========附加和分离数据库=========--
分离数据库是指将数据库从 SQL Server 实例中删除,但使数据库在其数据文件和事务日志文件中保持不变。
之后,就可以使用这些文件将数据库附加到任何 SQL Server 实例,包括分离该数据库的服务器。
使用场景,在教室或者公司的电脑上创建了一个数据库,想把这个数据库一点不变的拿到家里的数据库服务器上装
使用注意事项
第一,数据库中存在数据库快照。必须首先删除所有数据库快照,然后才能分离数据库。
第二,已复制并发布数据库。如果进行复制,则数据库必须是未发布的。必须通过运行 sp_replicationdboption 禁用发布后,才能分离数据库。
第三,该数据库正在某个数据库镜像会话中进行镜像,除非终止该会话,否则无法分离该数据库。
第四,数据库处于可疑状态。在 SQL Server 2005 和更高版本中,无法分离可疑数据库;必须将数据库设为紧急模式,才能对其进行分离。
*/
--使用内置存储过程sp_detach_db 来完成,例如分离数据库“Stu_db2”,SQL语句如下
USE master
GO
EXEC sp_detach_db Stu_db3
--比如创建了登录名“xiaotian”,默认数据库就是这个被分离的,那么“xiaotian”的默认数据库就将变成master数据库,同时也会删除其所有的元数据。

/*--附加数据库
通常附加好数据库以后,数据库的状态会和被分离前的那一刻完全一样。但是有些问题需要注意:
   从 SQL Server 2005 和更高版本中,附加和分离操作都会禁用数据库的跨数据库所有权链接。
   附加数据库时,TRUSTWORTHY 均设置为 OFF
   附加数据库时,所有数据文件(MDF 文件和 NDF 文件)都必须可用。如果任何数据文件的路径不同于首次创建数据库或上次附加数据库时的路径,则必须指定文件的当前路径。
   如果附加的主数据文件是只读的,则数据库引擎假定数据库也是只读的。
   无法在早期版本的 SQL Server 中附加由较新版本的 SQL Server 创建的数据库。
   与任何完全或部分脱机的数据库一样,不能附加正在还原文件的数据库。
   分离再重新附加只读数据库后,会丢失差异基准信息。这会导致 master 数据库与只读数据库不同步。之后所做的差异备份可能导致意外结果。因此,如果对只读数据库使用差异备份,在重新附加数据库后,应通过进行完整备份来建立当前差异基准。

第一种:使用SQL Server Management Studio附加数据库很简单。
1.  在【对象资源管理器】中找到【指定的Sql Server实例】下的【数据库】目录,右键单击,选择“附加”。弹出“附加数据库窗口”;
2.  点击窗口右边中部的“添加”按钮,添加要附加的数据文件;如图3-36
3.  点击确定,完成数据库附加。
*/
--第二种,用TSQL
USE master
GO
CREATE DATABASE Stu_db3 ON 
( FILENAME = 'D:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\Stu_db2.mdf' ),
( FILENAME = 'D:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\Stu_db2_log.ldf' ),
( FILENAME = 'e:\Stu_db3_a.ndf' ),
( FILENAME = 'e:\Stu_db3_a.ldf' )
FOR ATTACH
GO

--如果分离出来后日志文件无法使用了,可以使用FOR ATTACH_REBUILD_LOG关键字指定系统重建日志文件
CREATE DATABASE Stu_db3 ON 
( FILENAME = 'D:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\Stu_db2.mdf' )
FOR ATTACH_REBUILD_LOG
GO

/*--移动数据库文件--
使用场景:
故障恢复。例如,由于硬件故障,数据库处于可疑模式或被关闭。
预先安排位置需要调整。
文件所在的需要磁盘维护操作而进行的位置调整。
注意:如果要把文件移动到其他的服务器上就只有通过上面的分离、附加或者下面要讲的备份还原才可以解决了
*/
--1.在执行文件移动前先运行如下代码将stu_db3数据库状态设置为OFFLINE
ALTER DATABASE Stu_db3 SET OFFLINE 
--2.将所有的文件在Windows资源管理器中移动到新的位置。
--3.对于已移动的每个文件,请运行以下语句
ALTER DATABASE Stu_db3 
MODIFY FILE ( NAME = Stu_db3_a
, FILENAME = 'd:\Stu_db3_a.ndf' )
--4.设置完成后,恢复stu_db3数据库状态设置为ONLINE
ALTER DATABASE Stu_db3 SET ONLINE  --如果运行这句,你总是遇到问题,很简单,把你玩的这个文件的权限给够,让当前用户能够完全操作即可

--还有就是跨服务器复制数据库,有兴趣可以去玩玩,写代码的话很多,但是用图形界面也可以完成,我就不演示了

/* --备份&还原数据库   
从SQL Server 2005开始,可以在数据库联机并且正在使用时进行备份。但是,存在下列**:
1、隐式或显式引用脱机数据的任何备份操作都会失败,例如你要备份的数据库的一个文件组脱机。
2、数据库仍在使用时,SQL Server 可以使用联机备份过程来备份数据库。在备份过程中,可以进行多个操作;
例如:在执行备份操作期间允许使用 INSERT、UPDATE 或 DELETE 语句。
但是,如果在正在创建或删除数据库文件时尝试启动备份操作,则备份操作将等待,直到创建或删除操作完成或者备份超时。
例如文件的添加、删除、修改或者压缩等操作。
3、所有的恢复模式都允许您备份完整或部分的 SQL Server 数据库或数据库的单个文件或文件组。不能创建表级备份。

备份方式两种
第一种:图形化界面操作:

第二种:写代码
*/
Use master
go
backup database Stu_db3         --要备份的数据库
to disk='e:\db.bak' --备份文件的存放路径和名字
with name='逗你玩数据库备份'        --备份集名称
,description='数据库完全备份'      --备注
,init       --指定重写所有备份集。noinit,不覆盖现有备份

--差异备份
use master
go
backup database Stu_db3
to disk='e:\db-cy.bak'
with differential,            --表明是差异备份
description='数据库差异备份',    --备注
init                              --指定不覆盖现有备份


--校验备份文件
RESTORE FILELISTONLY from DISK='e:\db-cy.bak' with file=1

--还原操作
USE master
GO
RESTORE DATABASE Stu_db3
    FROM  DISK = 'e:\db.bak'
    WITH  FILE = 1  --备份设备中的第一个备份集
    , NORECOVERY    --不对数据库执行任何操作
    ,  NOUNLOAD --不对数据库做任何操作,不会滚未提交的事务
    ,  REPLACE      --覆盖现有数据库
GO  --因为后面还有差异备份,所以必须接着还原,否则数据库将认为没有还原完
RESTORE DATABASE Stu_db3
    FROM  DISK = 'e:\db-cy.bak'
    WITH  FILE = 1  --备份设备中的第一个备份集
    , NORECOVERY    --不对数据库执行任何操作
    ,  NOUNLOAD --不对数据库做任何操作,不会滚未提交的事务
    ,  REPLACE      --覆盖现有数据库
GO


上面的代码非但有图文,简直是视频,地址
http://www.cnthc.com/?/article/67
http://www.cnthc.com/?/article/73