MSSQL_2 数据库管理

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_43650411/article/details/102637827

目录

  • 创建
    • 数据库文件和文件组
    • 语法 CREATE DATABASE
  • 修改
    • 增加 | 删除文件和文件组
    • 数据库收缩
    • 8种常用数据库选项
    • 重命名数据库
  • 删除

1.数据库管理
数据库是存储表、索引以及表之间逻辑运算关系的容器。

1.1 创建数据库
创建时,需明确数据库的名称、所有者、大小以及存储该数据库的文件和文件组

  • 注意:
    1.有权
    2.创建者将成为所有者
    3.一个服务器实例可创建32767个数据库
    4.数据库名称命名遵循标识符规则
    5.创建数据库时,model数据库中所有用户定义对象都将复制到所有新数据库中。(get可以向model数据库中添加任何对象,以便这些对象包含到所有新建的数据库中。)

1.1.1 数据库文件和文件组
文件组是文件的命名集合,用于简化数据存放和管理任务(如备份和还原)。

  • 数据库文件
    1.主文件(.mdf),每个数据库都有一个主文件,包含数据库的启动信息,也用于存储数据。
    2.次要文件(.ndf),非必须,包含不能放置在主文件中的所有数据。
    3.事务日志文件(.ldf),每个数据库必须至少一个事务日志文件,包含用于恢复数据库的日志信息,最小512KB。
  • 文件组
    每个文件组有一个PRIMARY文件组,包含主文件和未放入其他文件组的次要文件。
    1.填充策略:对组内所有文件都使用按比例填充。eg.文件组有2个文件,f1有100M可用,f2有200M可用,则从f1分配一个区,f2分配两个区,两个文件几乎同时填满。
    2.文件扩展:自动轮流扩展组内一个文件(自动增长)。eg.文件组有f1,f2两个文件,组内文件都满后,自动扩展f1,f1满后自动扩展f2,f2满后自动拓展f1……类推。
    3.数据库性能优化:1)允许跨多个磁盘创建数据库,实现并发访问数据。2)可以将特定表的所有I/O定向到一个特定的磁盘(如建立常用文件组)。
  • 文件和文件组设计规则
    1.多个DB不能共用一个文件/组
    2.多个文件组不能共用一个文件
    3.事务日志不属于任何文件组
    4.建议:1)如使用多个文件,将附加文件都放入第2个文件组,并设置为默认。主文件只包含系统表和对象。2)事务日志文件与其它文件和文件组放于不同磁盘。

1.1.2 语法 CREATE DATABASE
创建数据库后,应备份master数据库。因为创建数据库会更新master中的系统表。

/* eg.1 默认
- 主文件  数据大小为model数据库主文件的大小
- 事务日志文件  512KB或主数据文件大小的25%(较大者)
- 文件可以自动增大到填满所有可用磁盘
*/
IF DB_ID('mydata') IS NOT NULL
	DROP DATABASE mydata
GO
CREATE DATABASE mydata


eg.2  指定数据文件和事务日志文件
IF DB_ID('mydata') IS NOT NULL
	DROP DATABASE mydata
GO
CREATE DATABASE mydata
ON
-- [PRIMARY]  -- 此处被省略,可显示指定主文件
( NAME = Sales_dat,    -- 第1个文件默认为主文件
	FILENAME = 'd:\saledat.mdf', 
	SIZE = 10,  -- 初始大小,默认MB
	MAXSIZE = 50,  -- 最大,达到后不再继续增长
	FILEGROWTH = 5)  -- 自动增长
LOG ON   -- 事务日志文件
( NAME = Sales_log,
	FILENAME = 'd:\Salelog.ldf',
	SIZE = 5MB,
	MAXSIZE = 25MB,
	FILEGROWTH = 5MB)


eg.3 
-- 包含文件Spri1_dat和Spri2_dat的PRIMARY文件组。将这些文件的FILEGROWTH增量指定为15%
-- 名为SalesGroup1的文件组,其中包含文件SGrp1Fi1和SGrp1Fi2;
-- 名为SalesGroup2的文件组,其中包含文件SGrp2Fi1和SGrp2Fi2。

IF DB_ID('mydata') IS NOT NULL
	DROP DATABASE mydata
GO
CREATE DATABASE  mydata
ON PRIMARY
( NAME = SPri1_dat,
    FILENAME = 'd:\SPri1dat.mdf',
    SIZE = 10,  -- 默认MB
    MAXSIZE = 50,
    FILEGROWTH = 15% ),
( NAME = SPri2_dat,
    FILENAME = 'd:\SPri2dt.ndf',
    SIZE = 10,
    MAXSIZE = 50,
    FILEGROWTH = 15% ),
FILEGROUP SalesGroup1
( NAME = SGrp1Fi1_dat,
    FILENAME = 'd:\SG1Fi1dt.ndf',
    SIZE = 10,
    MAXSIZE = 50,
    FILEGROWTH = 5 ),
( NAME = SGrp1Fi2_dat,
    FILENAME = 'd:\SG1Fi2dt.ndf',
    SIZE = 10,
    MAXSIZE = 50,
    FILEGROWTH = 5 ),
FILEGROUP SalesGroup2
( NAME = SGrp2Fi1_dat,
    FILENAME = 'd:\SG2Fi1dt.ndf',
    SIZE = 10,
    MAXSIZE = 50,
    FILEGROWTH = 5 ),
( NAME = SGrp2Fi2_dat,
    FILENAME = 'd:\SG2Fi2dt.ndf',
    SIZE = 10,
    MAXSIZE = 50,
    FILEGROWTH = 5 )
LOG ON
( NAME = Sales_log,
    FILENAME = 'd:\salelog.ldf',
    SIZE = 5MB,
    MAXSIZE = 25MB,
    FILEGROWTH = 5MB ) ;

1.2 修改数据库

  • 增加 | 删除
-- 文件
-- 修改文件设置
ALTER DATABASE mydata
MODIFY FILE
( NAME = SPri2_dat,
    SIZE = 15,
    MAXSIZE = 100,
    FILEGROWTH = 10% )
    
-- 增加数据文件
ALTER DATABASE mydata
ADD FILE
(
	NAME = SGrp1Fi3_dat,
	FILENAME = 'D:\SG1Fi3dt.ndf',
	SIZE = 5,
	MAXSIZE = 10,
	FILEGROWTH = 1)
TO FILEGROUP SalesGroup1

-- 删除文件
ALTER DATABASE mydata
REMOVE FILE SGrp1Fi2_dat


-- 文件组
-- 增加文件组
ALTER DATABASE mydata
ADD FILEGROUP SalesGroup3

-- 修改文件组名
ALTER DATABASE mydata
MODIFY FILEGROUP SalesGroup3
NAME = SaleGroup4
  • 收缩
-- 手动收缩
DBCC SHRINKDATABASE('mydata', 1)  
GO

-- 自动
ALTER DATABASE mydata
SET AUTO_SHRINK ON

-- 1.
-- 自动收缩数据库可用空间大小  默认OFF,关闭
AUTO_SHRINK  
-- 2.
-- 默认OFF,ON-双引号可用于标识符
QUOTED_IDENTIFIER   
-- 3.
-- 应始终为ON,修改后仅影响新列。
-- ON- 填充时,用空白填充char列,用零填充二进制列。
-- OFF- 修剪后,char列的尾随空白被修剪,二进制列的尾随零被修剪。
ANSI_PADDING

-- 测试
PRINT 'Testing with ANSI_PADDING ON'  
SET ANSI_PADDING ON;  
GO  
  
CREATE TABLE t1 (  
   charcol CHAR(16) NULL,   
   varcharcol VARCHAR(16) NULL,   
   varbinarycol VARBINARY(8)  
);  
GO  
INSERT INTO t1 VALUES ('No blanks', 'No blanks', 0x00ee);  
INSERT INTO t1 VALUES ('Trailing blank ', 'Trailing blank ', 0x00ee00);  
  
SELECT 'CHAR' = '>' + charcol + '\<', 'VARCHAR'='>' + varcharcol + '\<',  
   varbinarycol  
FROM t1;  
GO  
DROP TABLE t1;  


PRINT 'Testing with ANSI_PADDING OFF';  
SET ANSI_PADDING OFF;  
GO  
  
CREATE TABLE t2 (  
   charcol CHAR(16) NULL,   
   varcharcol VARCHAR(16) NULL,   
   varbinarycol VARBINARY(8)  
);  
GO  
INSERT INTO t2 VALUES ('No blanks', 'No blanks', 0x00ee);  
INSERT INTO t2 VALUES ('Trailing blank ', 'Trailing blank ', 0x00ee00);  
  
SELECT 'CHAR' = '>' + charcol + '\<', 'VARCHAR'='>' + varcharcol + '<',  
   varbinarycol  
FROM t2;  
GO  
DROP TABLE t2;

在这里插入图片描述

-- 4.
-- = <>与null比较运算时返回UNKNOWN
-- 建议始终保持 ON,将来可能无OFF
ANSI_NULLS  -- 默认ON

在这里插入图片描述

-- 5.
-- ON 允许插入空值
ANSI_NULLS_DFLT_ON

-- 测试正常
SET ANSI_NULL_DFLT_ON ON
if object_id('t1', 'U') is not null
	drop table t1
GO
CREATE TABLE t1(x int, y int)
INSERT INTO t1 VALUES(null, null)
SELECT * FROM t1
GO
-- 6.
-- ON 发出警告
-- 如果汇总函数中出现空值
-- 除0、算术溢出错误
ANSI_WARNINGS
-- 7. IMPLICT_TRANSACTION
-- 7.1 ON  设置为隐式事务模式,如果@@TRANCOUNT = 0,以下操作都会开始一个新的事务,相当于默认先执行一个BEGIN TRAN

在这里插入图片描述

当隐式事务模式时,如果@@ trancount> 0已经存在,则不会发出看不见的BEGIN TRANSACTION。但是,任何显式的BEGIN TRANSACTION语句仍将@@ TRANCOUNT递增。
未从表中选择的SELECT语句不会启动隐式事务。例如SELECT GETDATE();还是SELECT 1, ‘ABC’。
由于ANSI默认值,隐式事务可能会意外打开。

-- 7.2 OFF 默认是auticommit自动事务模式,可以主动发出显示事务(BEGIN TRAN)

当您的INSERT语句和工作单元中的任何其他操作完成时,您必须发出COMMIT TRANSACTION语句,直到@@ TRANCOUNT递减为0。或者您可以发出一个ROLLBACK TRANSACTION。

-- 8. NOCOUNT
-- ON 返回sql语句影响的行数
SET NOCOUNT ON
  • 重命名数据库
    重命名前应确保无人使用该数据库,且将数据库设置为单用户模式。
CREATE DATABASE tt
GO

-- 设置为单用户模式
ALTER DATABASE tt
SET SINGLE_USER
GO
-- 修改
ALTER DATABASE tt
MODIFY NAME = tt1
GO
-- 设置为多用户模式
ALTER DATABASE tt1
SET MULTI_USER
GO

1.3 删除数据库
数据库删除后,文件和数据都将从磁盘删除。
可以不用管数据库所处的状态。
备注:

  • 1.必须先删除数据库上存在的数据库快照
  • 2.如果涉及日志传送操作,应先取消日志传送
  • 3.删除为事务复制发布的数据库,或删除为合并复制发布的数据库,应先删除复制。如数据库损坏,可先ALTER DATABASE修改为脱机,然后删除。
  • 4.删除后备份master。删除数据库会更新master中信息。
-- database_snapshop 数据库快照
DROP DATABASE { dbname | database_snapshot_name}

猜你喜欢

转载自blog.csdn.net/weixin_43650411/article/details/102637827
今日推荐