您的位置:首页 > 数据库

【一些数据库的操作(创建,修改,set,收缩,扩大,分离附加等)】

2011-12-28 16:54 465 查看
---------------数据库操作-----------------

--创建数据库:

USE master

GO

CREATE DATABASE MyDB

ON PRIMARY

( NAME='MyDB_Primary',

FILENAME=

'E:/Program Files/Microsoft SQL Server/MSSQL10.MSSQLSERVER/MSSQL/DATA/MyDB_Prm.mdf',

SIZE=24MB,

MAXSIZE=65MB,

FILEGROWTH=1MB),

FILEGROUP MyDB_FG1

( NAME = 'MyDB_FG1_Dat1',

FILENAME =

'E:/Program Files/Microsoft SQL Server/MSSQL10.MSSQLSERVER/MSSQL/DATA/MyDB_FG1_1.ndf',

SIZE = 1MB,

MAXSIZE=10MB,

FILEGROWTH=1MB),

( NAME = 'MyDB_FG1_Dat2',

FILENAME =

'E:/Program Files/Microsoft SQL Server/MSSQL10.MSSQLSERVER/MSSQL/DATA/MyDB_FG1_2.ndf',

SIZE = 1MB,

MAXSIZE=10MB,

FILEGROWTH=1MB)

LOG ON

( NAME='MyDB_log',

FILENAME =

'E:/Program Files/Microsoft SQL Server/MSSQL10.MSSQLSERVER/MSSQL/DATA/MyDB.ldf',

SIZE=1MB,

MAXSIZE=10MB,

FILEGROWTH=1MB);

GO

----1.了解数据库的状态

/*

*ONLINE:可以对数据库进行访问。即使可能尚未完成恢复的撤消阶段,主文件组仍处于在线状态。

*OFFLINE:数据库无法使用。数据库由于显式的用户操作而处于离线状态,并保持离线状态直至执行了其他的用户操作。

*SUSPECT:至少主文件组可疑或可能已损坏。

*/

select name,state_desc from sys.databases where name='MyDB'

select DATABASEPROPERTYEX('MyDB','Status')

----2.往数据库里添加一个新的文件组MyDB_FG2

ALTER DATABASE MyDB

ADD FILEGROUP MyDB_FG2

--3.将新的文件MyDB_FG2_Dat2 加入到新的文件组MyDB_FG2

/*----知识点----

*向数据库添加文件时,可以指定文件的大小。如果没有为主文件提供大小,则数据库引擎将使用model 数据库中的主文件的大小。如果指定了辅助数据文件或日志文件,但未指定该文件的大小,则数据库引擎将以1 MB 作为该文件的大小。

*如果未指定文件的最大大小,那么文件将无限增长,直到磁盘已满。如果未指定文件增量,则数据文件的默认增量为1 MB,日志文件的默认增量为10%。最小增量为64 KB。

*/

ALTER DATABASE MyDB

ADD FILE

(

NAME='MyDB_FG2_Dat2',

FILENAME='E:/Program Files/Microsoft SQL Server/MSSQL10.MSSQLSERVER/MSSQL/DATA/MyDB_FG2_Dat2.ndf',

SIZE = 30MB,

MAXSIZE = 100MB

)

TO FILEGROUP MyDB_FG2

--4.新增加一个日志文件MyDB_log2?

ALTER DATABASE MyDB

ADD file

(

NAME='MyDB_log2',

FILENAME =

'E:/Program Files/Microsoft SQL Server/MSSQL10.MSSQLSERVER/MSSQL/DATA/MyDB_log2.ldf',

SIZE=1MB,

MAXSIZE=10MB,

FILEGROWTH=1MB

)

--5.移除一个数据库文件组MyDB_FG1(注意先清空文件组的数据文件)这

--先删除文件组里的文件

ALTER DATABASE MyDB

REMOVE FILE MyDB_FG1_Dat1;

ALTER DATABASE MyDB

REMOVE FILE MyDB_FG1_Dat2;

--然后删除文件组

ALTER DATABASE MyDB

REMOVE FILEGROUP MyDB_FG1;

--6. ALTER DATABASE 语句将用户定义文件组指定为默认文件组。

ALTER DATABASE MyDB

MODIFY FILEGROUP MyDB_FG2 DEFAULT;

--7.修改文件MyDB_FG2_Dat2的属性SIZE

ALTER DATABASE MyDB

MODIFY FILE

(

NAME='MyDB_FG2_Dat2',

FILENAME='E:/Program Files/Microsoft SQL Server/MSSQL10.MSSQLSERVER/MSSQL/DATA/MyDB_FG2_Dat2.ndf',

SIZE = 40MB,---40MB

MAXSIZE = 100MB,

FILEGROWTH=10%);

GO

--8.修改你的数据库所有者

EXEC sp_changedbowner 'newownername'

--9.修改你的数据库名字为poofly

USE master;

GO

ALTER DATABASE MyDB

Modify Name = poofly;

GO

--10.扩展数据库

--1.增加数据库文件的MAXSIZE,FILEGROWTH属性将决定自动增长如何发生(自动的)

--2.向文件组添加新文件(手动的)

--11.收缩数据库

--1.自动收缩数据库:将AUTO_SHRINK 数据库选项设置为ON 后,数据库引擎将自动收缩具有可用空间的数据库。作用相当于DBCC SHRINKDATABASE(dbname,25).默认情况下,此选项设置为OFF。

--2.手动收缩数据库:可以使用DBCC SHRINKDATABASE 语句或DBCC SHRINKFILE 语句来手动收缩数据库或数据库中的文件。

/*1.在该过程中任意时间都可停止DBCC SHRINKDATABASE 和DBCC SHRINKFILE 操作,所有已完成工作都将保留。

2.在使用DBCC SHRINKDATABASE 语句时,您无法将整个数据库收缩得比其初始大小更小。

3.使用DBCC SHRINKFILE 语句时,可以将各个数据库文件收缩得比其初始大小更小。必须对每个文件分别进行收缩,而不能尝试收缩整个数据库。

*/

DBCC SHRINKDATABASE

( database_name | database_id | 0

[ , target_percent ]

[ , { NOTRUNCATE | TRUNCATEONLY } ]

)

[ WITH NO_INFOMSGS ]

会收缩一个数据库的所有文件.数据库不能收缩到比model数据库还小,并且DBCC SHRINKDATABASE 也不能将一个文件收缩到比其最小的大小还小.

其中target_percent参数是数据库中每个文件所保留的自由空间的百分比.

比如:如果我用 DBCC SHRINKDATABASE(dbname,25) 其中一个总大小为MB文件的其中MB的数据库文件,可以保留%的可用空间,那么新的文件

大小为MB。怎么算出来的呢?x*1.0/(x+60)=25% x=20 所以总的大小为用掉的MB 加上空闲的MB 一共为MB。

如果文件是用掉了MB,那收缩还剩多少呢?x*1.0/(x+80)=25% x>20 注意这里x+80>100 这样超过了总大小,所以这个时候改文件不发生收缩,保持原来的大小.

所以整个数据库就是以这个方式逐个收缩数据库.

DBCC SHRINKFILE

(

{ file_name | file_id }

{ [ , EMPTYFILE ]

| [ [ , target_size ] [ , { NOTRUNCATE | TRUNCATEONLY } ] ]

}

)

[ WITH NO_INFOMSGS ]

其中的target_size 用兆字节表示的文件大小(用整数表示)。如果未指定,则 DBCC SHRINKFILE 将文件大小减少到默认文件大小。默认大小为创建文件时指定的大小。

这里只要注意不能将文件收缩到比存储数据所需空间还小.

例如:你的数据库文件一共MB,用了MB,那么你只能收缩到>=8MB的大小,即使你target_size=7mb,最后文件大小还是MB

你也许会发现这里有几个选项可选:

1.NOTRUNCATE:在指定或不指定 target_percent 的情况下,将已分配的页从数据文件的末尾移动到该文件前面的未分配页。文件末尾的可用空间不会返回给操作系统,文件的物理大小也不会更改。

因此,指定 NOTRUNCATE 时,文件看起来未收缩。NOTRUNCATE 只适用于数据文件。日志文件不受影响。

2.TRUNCATEONLY:将文件末尾的所有可用空间释放给操作系统,但不在文件内部执行任何页移动。数据文件只收缩到最后分配的区。

如果随 TRUNCATEONLY 指定了 target_size,则会忽略该参数。TRUNCATEONLY 只适用于数据文件。

3.EMPTYFILE:将指定文件中的所有数据迁移到同一文件组中的其他文件。只适合DBCC SHRINKDATABASE

--例子:截断数据库

DBCC SHRINKDATABASE (dbname, TRUNCATEONLY);

--例子:将数据文件收缩到指定的目标大小

DBCC SHRINKFILE (dbname, 7);

--例子:将日志文件收缩到指定的目标大小

-- 将数据库的恢复模式设置为SIMPLE

ALTER DATABASE dbname

SET RECOVERY SIMPLE;

GO

-- 收缩你的日志文件到MB

DBCC SHRINKFILE (dbname_log,3);

GO

--重新设置回你的恢复模式

ALTER DATABASE AdventureWorks

SET RECOVERY FULL;

GO

--例子:清空文件

-- 首先创建一个文件(举例而已)

ALTER DATABASE AdventureWorks

ADD FILE (

NAME = Test1data,

FILENAME = 'C:/t1data.ndf',

SIZE = 5MB

);

GO

-- 转移你的数据库文件到该文件组的其他文件

DBCC SHRINKFILE (Test1data, EMPTYFILE);

GO

-- 移除你的数据库文件

ALTER DATABASE AdventureWorks

REMOVE FILE Test1data;

GO

--12:设定数据库的兼容级别

/*

要使数据库与之兼容的SQL Server 版本。该值必须为下列值之一:

80 = SQL Server 2000

90 = SQL Server 2005

100 = SQL Server 2008

*/

ALTER DATABASE dbname

SET COMPATIBILITY_LEVEL = 90

--13:设置数据库的恢复模式和数据页面验证选项

USE master;

GO

ALTER DATABASE dbname

SET RECOVERY FULL, PAGE_VERIFY CHECKSUM;

GO

--14:将数据库设置为READ_ONLY

USE master;

GO

ALTER DATABASE dbname

SET SINGLE_USER

WITH ROLLBACK IMMEDIATE;

GO

ALTER DATABASE dbname

SET READ_ONLY;

GO

ALTER DATABASE dbname

SET MULTI_USER;

GO

--15.对数据库启用快照隔离

USE master;

GO

ALTER DATABASE AdventureWorks

SET ALLOW_SNAPSHOT_ISOLATION ON;

--16.分离数据库

/*-----知识点--------

*存在下列任何情况,则不能分离数据库:

1.已复制并发布数据库。如果进行复制,则数据库必须是未发布的。

2.数据库中存在数据库快照。必须首先删除所有数据库快照,然后才能分离数据库。

3.该数据库正在某个数据库镜像会话中进行镜像。除非终止该会话,否则无法分离该数据库。

4.数据库处于可疑状态。在SQL Server 2005 和更高版本中,无法分离可疑数据库;必须将数据库设为紧急模式,才能对其进行分离。

5.该数据库是系统数据库。

*/

--注意:分离数据库需要对数据库有独占访问权限。如果要分离的数据库正在使用当中,则必须先将该数据库设置为SINGLE_USER 模式以获取独占访问权限,然后才能对其进行分离。

USE master;

ALTER DATABASE dbname

SET SINGLE_USER;

GO

--例子:对skipchecks 设置(指定跳过还是运行UPDATE STATISTIC。)为True 的数据库进行分离

EXEC sp_detach_db 'dbname', 'true';

--例子:以下示例将分离数据库,并保留全文索引文件和全文索引的元数据。此命令将运行UPDATE STATISTICS,这是默认行为。

exec sp_detach_db @dbname='AdventureWorks',@keepfulltextindexfile='true';

--17.附加数据库

--附加数据库时,所有数据文件(MDF 文件和NDF 文件)都必须可用。如果任何数据文件的路径不同于首次创建数据库或上次附加数据库时的路径,则必须指定文件的当前路径。

EXEC sp_attach_db @dbname = N'poofly',

@filename1 = N'C:/Program Files/Microsoft SQL Server/MSSQL10.MSSQLSERVER/MSSQL/Data/poofly_Data.mdf',

@filename2 = N'C:/Program Files/Microsoft SQL Server/MSSQL10.MSSQLSERVER/MSSQL/Data/poofly_log.ldf';

--or

USE master;

GO

sp_detach_db yourdb;

GO

-- 获取文件路径(只需要附加上你的主文件)

DECLARE @data_path nvarchar(256);

SET @data_path = (SELECT SUBSTRING(physical_name, 1, CHARINDEX(N'master.mdf', LOWER(physical_name)) - 1)

FROM master.sys.master_files

WHERE database_id = 1 AND file_id = 1);

-- 利用ATTACH附加创建数据库

EXEC ('CREATE DATABASE yourdb

ON (FILENAME = '''+ @data_path + 'yourdb.mdf'')

FOR ATTACH');

GO

--18.有关数据库文件的移动

参看http://blog.csdn.net/feixianxxx/archive/2009/11/23/4859068.aspx

--19.删除数据库

DROP DATABASE dbname1,dbname2;

/*ps:必须满足下列条件才能删除数据库:

*如果数据库涉及日志传送操作,请在删除数据库之前取消日志传送操作

*若要删除为事务复制发布的数据库,或删除为合并复制发布或订阅的数据库,必须首先从数据库中删除复制。

*必须首先删除数据库中存在的数据库快照。

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐