SQL server数据库操作规范
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
海航集团IT运维手册
SQL Server数据库操作规范
操作规范
(V0.1)版本记录
文档名称约定如下:
海航集团IT运维手册—xx(服务名)—xx(文档名)
文档简介
本文档规范海南海航航空信息有限公司IT运维人员的数据库日常操作,提高IT系统和服务的质量,向业务人员和相关用户提供更优质的IT服务。
SQL server数据库操作规范
操作规范 ...................................................................................................................................... 错误!未定义书签。
(V0.1)............................................................................................................................................ 错误!未定义书签。
文档名称约定如下: .......................................................................................................... 错误!未定义书签。
文档简介 .............................................................................................................................. 错误!未定义书签。
1. 第一部分SQL Server2000数据库..................................................................................... 错误!未定义书签。
1.1 数据库和事务日志备份 ...................................................................................... 错误!未定义书签。
1.2 数据库完整性检查 .............................................................................................. 错误!未定义书签。
1.2.1 使用SQL Server2000企业管理中的数据库维护计划向导实施.............. 错误!未定义书签。
1.3 数据库和事务日志恢复 ...................................................................................... 错误!未定义书签。
1.3.1 数据库恢复(不恢复事务日志)............................................................... 错误!未定义书签。
方法一:使用SQL Server2000企业管理恢复.................................. 错误!未定义书签。
方法二:使用SQL语句恢复数据库 ................................................. 错误!未定义书签。
1.3.2 数据库+事务日志恢复 ................................................................................ 错误!未定义书签。
1.3.3方法一:使用SQL Server2000企业管理恢复。
...................................... 错误!未定义书签。
1.3.4 方法二:使用SQL语句恢复数据库......................................................... 错误!未定义书签。
1.4 数据库迁移 .......................................................................................................... 错误!未定义书签。
1.4.1 方法一:利用备份和恢复迁移数据库....................................................... 错误!未定义书签。
1.4.2 方法二:使用分离和附加数据库文件迁移数据库................................... 错误!未定义书签。
1.5 数据库对象和数据导入导出 .............................................................................. 错误!未定义书签。
1.5.1 通过工具DTS的设计器进行导入或导出 ................................................. 错误!未定义书签。
1.6 收缩数据库日志文件 .......................................................................................... 错误!未定义书签。
1.6.1 方法一:通过SQL2000企业管理器收缩日志文件 ................................. 错误!未定义书签。
1.6.2方法二:使用以下SQL语句收缩数据库日志文件 ................................. 错误!未定义书签。
1.7 数据库JOB迁移 ................................................................................................. 错误!未定义书签。
1.8 迁移数据库帐号和密码 ...................................................................................... 错误!未定义书签。
1.8.1 方法一:手工在目的数据库中新建数据库帐号和设置密码................... 错误!未定义书签。
1.8.2 方法二:使用脚本迁移(在SQL Server2000 实例之间传输登录和密码)错误!未定义书
签。
1.9 重建数据库索引 .................................................................................................. 错误!未定义书签。
1.9.1 方法一:使用数据库维护向导来执行索引重建,创建维护计划来完成。
错误!未定义书签。
1.9.2 方法二:选择性的重建索引 ...................................................................... 错误!未定义书签。
2. 第二部分SQL Server2005数据库..................................................................................... 错误!未定义书签。
2.1 数据库迁移 .......................................................................................................... 错误!未定义书签。
2.1.1 方法一:利用备份和恢复迁移数据库....................................................... 错误!未定义书签。
2.1.2 方法二:使用分离和附加数据库文件迁移数据库(与SQL Server2000有所不同)错误!未
定义书签。
2.2 数据导入导出 ...................................................................................................... 错误!未定义书签。
2.3 数据库对象的复制 .............................................................................................. 错误!未定义书签。
2.3.1 方法一:使用“复制数据库”功能复制全部的数据库对象................... 错误!未定义书签。
2.3.2 方法二:“生成脚本”数据库对象(表、存储过程)脚本..................... 错误!未定义书签。
2.4 迁移数据库帐号和密码 ...................................................................................... 错误!未定义书签。
2.4.1 方法一:手工在目的数据库中新建数据库帐号和设置密码................... 错误!未定义书签。
2.4.2 方法二:使用脚本迁移(在SQL Server2005 实例之间传输登录和密码)错误!未定义书
签。
1. 第一部分SQL Server2000数据库
源服务器和目的服务器SQL数据库的排序规则必须一致,否则可能会产生数据错误,请在安装SQL Server数据库时注意检查SQL数据库排序规则。
1.1 数据库和事务日志备份
方法:使用SQL Server2000企业管理中的数据库维护计划向导实施
1、打开SQL Server2000企业管理器,在“管理”—“数据库维护计划”中点击“新建维护计划”
2、在欢迎页面点击“下一步”
3、选择要备份的数据库,点击“下一步”
4、在“更新数据优化信息页面”不要做任何选择,点击“下一步”
5、在“检查数据库完整性页面”不做选择,点击“下一步”
6、在“指定数据库备份计划”页面,选择如下图
点击上图中的“更改”,在作业调度页面编辑调度
7、指定数据库备份存放目录和数据库备份保留的时间(也可以选择“为每个数据库创建子目录”)
8、选择事务日志备份
编辑事务日志作业调度
9、指定事务日志备份存放目录和事务日志备份保留的时间(也可以选择“为每个数据库创建子目录”)
10、记录维护计划报表、记录
11、点击“完成”后维护计划就创建完成了。
12、在数据库维护计划列表中可以查看、编辑该维护计划
13、在作业中可以查看该维护计划作业的执行情况
注意:
收缩数据库或执行其他截断事务日志操作后,必须马上做一次数据库全备,以免事务日志备份不连续而失效。
1.2 数据库完整性检查
1.2.1 使用SQL Server2000企业管理中的数据库维护计划向导实施
1、打开SQL Server2000企业管理器,在“管理”—“数据库维护计划”中点击“新建维护计划”
2、在欢迎页面点击“下一步”
3、选择要检查的数据库,点击“下一步”
4、在“更新数据优化信息页面”不要做任何选择,点击“下一步”
5、在“检查数据库完整性”和“尝试修复所有小问题”前打钩,点击“更改”编辑作业调度时间,编
完成后点击“下一步”
6、在指定数据库和事务日志备份计划页面不做选择,如下图
7、将报表写入文件
8、将历史记录写入表中
9、最后点击“完成”后维护计划就创建完成了。
10、在数据库维护计划列表中可以查看、编辑该维护计划
注意:数据库备份和完整性检查维护计划可以在同一个维护计划中创建,不过为了更直观的看到数据库备份
和完整性检查计划的执行成功与否,建议分开创建。
1.3 数据库和事务日志恢复
1.3.1 数据库恢复(不恢复事务日志)
1.3.1.1 方法一:使用SQL Server2000企业管理恢复
1、右键点击要还原的数据库,点击“所有任务”中的“还原数据库”(如服务器实例中没有该数据库,
需要新建一个同名数据库,)
2、在“常规”选项卡中选择要还原的数据库备份文件,以及“还原备份集”中的“数据库-完全”选项
3、在“选项”选项卡中,按图中红圈内容选择,数据库物理路径注意要选择正确
4、点击“确定”后即可开始还原数据库
注意:如要还原的数据库正被使用,则无法还原成功,需要断开所有数据库连接或重启数据库服务后,再重新执行数据库还原操作。
1.3.1.2 方法二:使用SQL语句恢复数据库
1、恢复数据库(完全恢复)SQL语法:
restore database [数据库名] from disk='数据库备份文件物理路径' with recovery
例:恢复dbhnaoa3_2007数据库
restore database [dbhnaoa3_2007] from disk='e:/databackup/dbhnaoa3_2007/dbhnaoa3_2007.bak' with recovery
1.3.2 数据库+事务日志恢复
1.3.3方法一:使用SQL Server2000企业管理恢复。
1、还原数据库完全备份:右键点击要还原的数据库,点击“所有任务”中的“还原数据库”(如服务器
实例中没有该数据库,需要新建一个同名数据库,)
2、在“常规”选项卡中选择要还原的数据库备份文件,以及“还原备份集”中的“数据库-完全”选项
3、在“选项”选项卡中,恢复完成状态选择“使数据库不再运行,但能还原其它事务日志”
3、还原事务日志:右键点击要还原的数据库,点击“所有任务”中的“还原数据库”
4、在“常规”选项卡中选择要还原的数据库日志文件,以及“还原备份集”中的“事务日志”选项
5、在“选项”选项卡中,选择恢复完成状态:
(1)如还原中间事务日志,请选择“使数据库不再运行,但能还原其它事务日志”;
(2)如还原最后一个事务日志,请选择“使数据库可以继续运行,但无法还原其他事务日志”;
1.3.4 方法二:使用SQL语句恢复数据库
1、恢复数据库完全备份:
restore database [数据库名] from disk='数据库备份文件物理路径' with norecovery
2、恢复中间事务日志:
restore log [数据库名] from disk='数据库事务日志文件物理路径' with norecovery
3、恢复最后一个事务日志:
restore log [数据库名] from disk='数据库事务日志文件物理路径' with recovery
例:恢复dbhnaoa3_2007数据库+事务日志,步骤如下:
1、restore database [dbhnaoa3_2007] from disk='e:/databackup/dbhnaoa3_2007/dbhnaoa3_2007.bak' with
recovery ;
2、restore log [dbhnaoa3_2007] from disk='e:/sql_日志备份
/dbhnaoa3_2007/DBHNAOA3_2007_tlog_2120.TRN' with norecovery ;
3、restore log [dbhnaoa3_2007] from disk='e:/sql_日志备份
/dbhnaoa3_2007/DBHNAOA3_2007_tlog_2120.TRN' with recovery ;
1.4 数据库迁移
1.4.1 方法一:利用备份和恢复迁移数据库
先对源数据库进行完全备份,备份到一个设备(device)上,然后把备份文件复制到目的服务器上,进行数据库的恢复操作,在恢复的数据库名中填上源数据库的名字(名字必须相同),选择强制型恢复(可以覆盖以前数据库的选项),在选择从设备中进行恢复,浏览时选中备份的文件就行了。
这种方法可以完全恢复数据库,包括外键,主键,索引。
1.4.2 方法二:使用分离和附加数据库文件迁移数据库
停止sql server数据库服务或者分离某数据库后,拷贝该数据库文件(包括.mdf 和.ldf)到目标数据库服务器后,再重新附加该数据库
1.5 数据库对象和数据导入导出
1.5.1 通过工具DTS的设计器进行导入或导出
DTS的设计器功能强大,支持多任务,也是可视化界面,容易操作,如果只是进行SQL Server数据库中部分表的移动,用这种方法最好,当然,也可以进行全部表的移动。
在SQL Server Enterprise Manager中,展开服务器左边的+,选择数据库,右击,选择All tasks/Import Data...(或All tasks/Export Data...),进入向导模式,按提示一步一步走就行了,里面分得很细,可以灵活的在不同数据源之间复制数据,很方便的。
而且可以另存成DTS包,如果以后还有相同的复制任务,直接运行DTS包就行,省时省力。
如果只是复制表和表数据,不复制表对象,选择“从源数据库复制表和视图”,接着选择要复制的表和视图。
如果复制表、表对象和表数据,选择“在Sql server数据库之前复制对象和数据”
如果想复制扩展属性,在“包括扩展属性”前打钩。
如果不想复制所有对象,取消“复制所有对象”前的钩,点击“选择对象”
在选择对象选择卡中选择要复制的对象
接下来的步骤按提示继续往下就可以了。
注意:
使用DTS向导在SQL SERVER之间或两个数据库之间进行数据导入导出按默认值配置,则只导入导出表对象连同视图对象,象其他的比如默认值、存储过程等对象可能丢失,假如希望任何的数据库对象都在导
入导出之列,请在DTS向导过程中选择“在SQL SERVER数据库复制对象和数据”,接下来就能够选择各个对象进行导入导出了。
在导的过程中容易出错,可能是由于对象创键的顺序造成的,假如出错建议分多次导,导的顺序能够为:自定义数据类型,表,视图,默认值,约束,自定义函数,存储过程等
1.6 收缩数据库日志文件
1.6.1 方法一:通过SQL2000企业管理器收缩日志文件
一般情况下,SQL数据库的收缩并不能很大程度上减小数据库大小,其主要作用是收缩日志大小,应当定期进行此操作以免数据库日志过大
1、设置数据库模式为简单模式:打开SQL企业管理器,在控制台根目录中依次点开Microsoft SQL Server-->SQL Server组-->双击打开你的服务器-->双击打开数据库目录-->选择你的数据库名称(如论坛数据库Forum)-->然后点击右键选择属性-->选择选项-->在故障还原的模式中选择“简单”,然后按确定保存
2、在当前数据库上点右键,看所有任务中的收缩数据库,一般里面的默认设置不用调整,直接点“确定”
3、收缩数据库完成后,将数据库故障还原模式重新设置为“完全”,操作方法参考第一步。
1.6.2方法二:使用以下SQL语句收缩数据库日志文件
BACKUP LOG 数据库文件名 WITH TRUNCATE_ONLY DBCC SHRINKFILE (该数据库日志文件名)
例:BACKUP LOG hnair_oa WITH TRUNCATE_ONLY DBCC SHRINKFILE (hnair_oa_log)
注意:
定期做数据库日志备份,或使用SQL语句截断事务日志BACKUP LOG 库名 WITH NO_LOG,可以截断事务日志,以便重复利用已有的事务日志空间。
1.7 数据库JOB迁移
备份源数据库服务器上的msdb数据库,将msdb备份拷贝到目标服务器,在目标服务器上恢复msdb数据库后,将msdb库sysjobs表的originating_server列的机器名改为目标服务器机器名,这样JOB就迁移成功了。
1.8 迁移数据库帐号和密码
1.8.1 方法一:手工在目的数据库中新建数据库帐号和设置密码
1.8.2 方法二:使用脚本迁移(在SQL Server2000 实例之间传输登录和密码)
此方法用于将源数据库服务器的登录和密码传输到目的服务器,而不必手工在目的服务器上建立登录和授予帐号权限,非常方便;在不知道数据库帐号密码的情况下此方法更加安全方便。
注意:必须将源服务器上的数据库全部迁移到目的服务器后,才能开始传输数据库登录和密码,否则可能会造成数据库帐号权限的丢失。
请执行以下操作:
(1)在Master 数据库中创建和运行存储过程
在源 SQL Server服务器上运行以下脚本。
此脚本在master数据库中创建名为sp_hexadecimal和sp_help_revlogin的两个存储过程。
请在完成存储过程的创建之后继续执行第 2 步。
----- Begin Script, Create sp_help_revlogin procedure -----
USE master
GO
IF OBJECT_ID ('sp_hexadecimal') IS NOT NULL
DROP PROCEDURE sp_hexadecimal
GO
CREATE PROCEDURE sp_hexadecimal
@binvalue varbinary(256),
@hexvalue varchar(256) OUTPUT
AS
DECLARE @charvalue varchar(256)
DECLARE @i int
DECLARE @length int
DECLARE @hexstring char(16)
SELECT @charvalue = '0x'
SELECT @i = 1
SELECT @length = DATALENGTH (@binvalue)
SELECT @hexstring = '09ABCDEF'
WHILE (@i <= @length)
BEGIN
DECLARE @tempint int
DECLARE @firstint int
DECLARE @secondint int
SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))
SELECT @firstint = FLOOR(@tempint/16)
SELECT @secondint = @tempint - (@firstint*16)
SELECT @charvalue = @charvalue +
SUBSTRING(@hexstring, @firstint+1, 1) +
SUBSTRING(@hexstring, @secondint+1, 1)
SELECT @i = @i + 1
END
SELECT @hexvalue = @charvalue
GO
IF OBJECT_ID ('sp_help_revlogin') IS NOT NULL
DROP PROCEDURE sp_help_revlogin
GO
CREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL AS DECLARE @name sysname
DECLARE @xstatus int
DECLARE @binpwd varbinary (256)
DECLARE @txtpwd sysname
DECLARE @tmpstr varchar (256)
DECLARE @SID_varbinary varbinary(85)
DECLARE @SID_string varchar(256)
IF (@login_name IS NULL)
DECLARE login_curs CURSOR FOR
SELECT sid, name, xstatus, password FROM master..sysxlogins
WHERE srvid IS NULL AND name <> 'sa'
ELSE
DECLARE login_curs CURSOR FOR
SELECT sid, name, xstatus, password FROM master..sysxlogins
WHERE srvid IS NULL AND name = @login_name
OPEN login_curs
FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @xstatus, @binpwd IF (@@fetch_status = -1)
BEGIN
PRINT 'No login(s) found.'
CLOSE login_curs
DEALLOCATE login_curs
RETURN -1
END
SET @tmpstr = '/* sp_help_revlogin script '
PRINT @tmpstr
SET @tmpstr = '** Generated '
+ CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */'
PRINT @tmpstr
PRINT ''
PRINT 'DECLARE @pwd sysname'
WHILE (@@fetch_status <> -1)
BEGIN
IF (@@fetch_status <> -2)
BEGIN
PRINT ''
SET @tmpstr = '-- Login: ' + @name
PRINT @tmpstr
IF (@xstatus & 4) = 4
BEGIN -- NT authenticated account/group
IF (@xstatus & 1) = 1
BEGIN -- NT login is denied access
SET @tmpstr = 'EXEC master..sp_denylogin ''' + @name + ''''
PRINT @tmpstr
END
ELSE BEGIN -- NT login has access
SET @tmpstr = 'EXEC master..sp_grantlogin ''' + @name + ''''
PRINT @tmpstr
END
END
ELSE BEGIN -- SQL Server authentication
IF (@binpwd IS NOT NULL)
BEGIN -- Non-null password
EXEC sp_hexadecimal @binpwd, @txtpwd OUT
IF (@xstatus & 2048) = 2048
SET @tmpstr = 'SET @pwd = CONVERT (varchar(256), ' + @txtpwd + ')' ELSE
SET @tmpstr = 'SET @pwd = CONVERT (varbinary(256), ' + @txtpwd + ')' PRINT @tmpstr
EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT
SET @tmpstr = 'EXEC master..sp_addlogin ''' + @name
+ ''', @pwd, @sid = ' + @SID_string + ', @encryptopt = '
END
ELSE BEGIN
-- Null password
EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT
SET @tmpstr = 'EXEC master..sp_addlogin ''' + @name
+ ''', NULL, @sid = ' + @SID_string + ', @encryptopt = '
END
IF (@xstatus & 2048) = 2048
-- login upgraded from 6.5
SET @tmpstr = @tmpstr + '''skip_encryption_old'''
ELSE
SET @tmpstr = @tmpstr + '''skip_encryption'''
PRINT @tmpstr
END
END
FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @xstatus, @binpwd
END
CLOSE login_curs
DEALLOCATE login_curs
RETURN 0
GO
----- End Script -----
(2)在创建sp_help_revlogin存储过程后,请从源服务器上的查询分析器中运行sp_help_revlogin过程:
EXEC master..sp_help_revlogin
(3)保存输出,然后将其粘贴到目标 SQL Server 上的查询分析器中,并运行它。
这样就完成的数据库登录和密码的传输。
(sp_help_revlogin存储过程可同时用于 SQL Server 7.0 和 SQL Server 2000。
sp_help_revlogin存储过程的输出是登录脚本,该脚本可创建带有原始 SID 和密码的登录。
)
1.9 重建数据库索引
重建索引可以重新组织索引数据(对于聚集索引还包括表数据)的存储,清除碎片,提高磁盘性能。
重建索引会对表执行排它锁,在重建索引期间禁止用户访问,建议在例行检修时候重建索引。
1.9.1 方法一:使用数据库维护向导来执行索引重建,创建维护计划来完成。
如果你原意接受它固有的缺陷,这也可以使用。
因为它将重建每一个索引,不管它是否需要重建。
如果有一个有很多大表和大量索引的大数据库,这会出问题,因为不加区别的重建整个数据库的索引会花费很长的时间,会使你的维护窗口不可用。
问题在于,要么全部重建,要么全部不重建,你根本不能以任何方式分批处理数据库的表。
具体操作如下:
在欢迎页面点击“下一步”
在“选择数据库”页面选择要重建索引的数据库
在“更新数据优化信息”页面,选上“重新组织数据和索引页”,并选择调度的时间。
维护计划向导中的其他计划可根据需要自行选择。
重新组织数据和索引页的时候,数据库需设置成单用户方式,否则计划将执行失败。
1.9.2 方法二:选择性的重建索引
检查表的索引和数据的碎片,仅重建那些实际需要重建的表的数据和索引。
这种方式能最小化索引重建的时间。
DBCC SHOWCONTIG是SQLServer提供来检查索引碎片情况的工具。
表的扩展盘区扫描碎片的百分比越大,说明碎片越多。
索引碎片不太多时,可以重新组织索引。
不过,如果索引碎片非常多,重新生成索引则可以获得更好的结果。
Rebuild Index(重新生成索引)
重新生成SQL Server 数据库表和视图中的索引。
可以重新生成单个数据库或多个数据库中的索引。
如
果任务仅重新生成单个数据库中的索引,则可以选择任务要重新生成其索引的视图和表。
使用默认可用空间重新组织页删除数据库中表上的索引,并使用在创建索引时指定的填充因子重新创建索引。
Reorganize Index(重新组织索引)
重新组织SQL Server 数据库表和视图中的索引。
通过使用“重新组织索引”任务,包可以重新组织单个数据库或多个数据库中的索引。
如果此任务仅重新组织单个数据库中的索引,则可以选择任务要重新组织其索引的视图或表。
“重新组织索引”任务还包含压缩大型对象数据的选项。
大型对象数据是具有image 、text、ntext、varchar(max)、nvarchar(max)、varbinary(max) 或xml 数据类型的数据。
DBCC DBREINDEX(重建指定数据库中表的一个或多个索引,不能在线使用)
当运行DBCC DBREINDEX()的时候,必须对表有排他锁,因为它是一个完全的,彻头彻尾的索引重建操作。
DBCC INDEXDEFRAG(整理指定的表或视图的聚集索引和辅助索引碎片,可以在线使用)
DBCC INDEXDEFRAG可以在线操作,但重建的索引不完全。
它不长期控制锁,因此不会防碍运行查询或更新。
若索引的碎片相对较少,则整理该索引的速度比生成一个新索引要快,这是因为碎片整理所需的时间与碎片的数量有关。
对碎片太多的索引进行整理可能要比重建花更多的时间。
注意:执行维护计划最好按一定的顺序,首先是执行检查数据库完整性,然后是收缩数据库,重新生成索引或者重新组织索引任务,最后是更新统计信息。
使用哪种方法重建索引需由管理员根据系统情况而定,具体使用语法请查看sql server2000数据库帮助。
2. 第二部分SQL Server2005数据库
源服务器和目的服务器SQL数据库的排序规则必须一致,否则可能会产生数据错误,请在安装SQL Server数据库时注意检查SQL数据库排序规则。
2.1 数据库迁移
2.1.1 方法一:利用备份和恢复迁移数据库
操作方法同1.4.1
2.1.2 方法二:使用分离和附加数据库文件迁移数据库(与SQL Server2000有所不同)
1、如果SQL Server2005数据库没有启用全文索引,分离和附加方法同SQL Server2000
2、如果SQL Server2005数据库启用了全文索引,除分离和附加数据库文件外,数据库包含的全文文件会随数据库一起附加。
因此在分离数据库文件后,全文目录需要和数据库文件一起拷贝到目标服务器,且在目标服务器放置的路径必须和源服务器上文件的路径一致。
下图中红框部分就是全文目录。
如果存在下列任何情况,则不能分离数据库:
●已复制并发布数据库。
如果进行复制,则数据库必须是未发布的。
必须通过运行sp_replicationdboption
禁用发布后,才能分离数据库。
●数据库中存在数据库快照。
必须首先删除所有数据库快照,然后才能分离数据库。
●该数据库正在某个数据库镜像会话中进行镜像。
除非终止该会话,否则无法分离该数据库。
●数据库处于可疑状态。
在 SQL Server 2005 中,无法分离可疑数据库;必须将数据库置入紧急模式,才
能对其进行分离。
●该数据库是系统数据库。
2.2 数据导入导出
SQL Server2005 导入和导出向导将数据从源复制到目标。
该向导还可以创建目标数据库和目标表,但是不能复制数据库对象(包括主键、列的默认属性等),这一点与SQL Server2000不同。
2.3 数据库对象的复制
2.3.1 方法一:使用“复制数据库”功能复制全部的数据库对象
2.3.2 方法二:“生成脚本”数据库对象(表、存储过程)脚本
使用SQL Server脚本向导,生成指定表的数据库对象脚本,将该脚本拷贝到目标服务器并运行该脚本,
脚本运行完毕后,将生成与源数据库相同结构(包括主键、列默认值等属性)的目的表(该表为空表),最后用SQL Server2005 导入和导出向导将表数据从源表导入目的表。
如果复制某些表的数据,还复制表的主键、列的默认属性等,必须使用此方法。
2.4 迁移数据库帐号和密码
2.4.1 方法一:手工在目的数据库中新建数据库帐号和设置密码
2.4.2 方法二:使用脚本迁移(在SQL Server2005 实例之间传输登录和密码)
此方法用于将源数据库服务器的登录和密码传输到目的服务器,而不必手工在目的服务器上建立登录和授予帐号权限,非常方便;在不知道数据库帐号密码的情况下此方法更加安全方便。
注意:必须将源服务器上的数据库全部迁移到目的服务器后,才能开始传输数据库登录和密码,否则可能会造成数据库帐号权限的丢失。
请执行以下步骤:
1、在源服务器上,启动SQL Server Management Studio,然后连接到要从中移动数据库的SQL Server 实例。
2、打开新的查询编辑器窗口,然后运行以下脚本。
USE master
GO
IF OBJECT_ID ('sp_hexadecimal') IS NOT NULL
DROP PROCEDURE sp_hexadecimal
GO
CREATE PROCEDURE sp_hexadecimal
@binvalue varbinary(256),
@hexvalue varchar (514) OUTPUT
AS
DECLARE @charvalue varchar (514)
DECLARE @i int
DECLARE @length int
DECLARE @hexstring char(16)
SELECT @charvalue = '0x'
SELECT @i = 1
SELECT @length = DATALENGTH (@binvalue)
SELECT @hexstring = '09ABCDEF'
WHILE (@i <= @length)
BEGIN
DECLARE @tempint int
DECLARE @firstint int
DECLARE @secondint int
SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))
SELECT @firstint = FLOOR(@tempint/16)
SELECT @secondint = @tempint - (@firstint*16)
SELECT @charvalue = @charvalue +
SUBSTRING(@hexstring, @firstint+1, 1) +
SUBSTRING(@hexstring, @secondint+1, 1)
SELECT @i = @i + 1
END
SELECT @hexvalue = @charvalue
GO
IF OBJECT_ID ('sp_help_revlogin') IS NOT NULL
DROP PROCEDURE sp_help_revlogin
GO
CREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL AS
DECLARE @name sysname
DECLARE @type varchar (1)
DECLARE @hasaccess int
DECLARE @denylogin int
DECLARE @is_disabled int
DECLARE @PWD_varbinary varbinary (256)
DECLARE @PWD_string varchar (514)
DECLARE @SID_varbinary varbinary (85)
DECLARE @SID_string varchar (514)
DECLARE @tmpstr varchar (1024)
DECLARE @is_policy_checked varchar (3)
DECLARE @is_expiration_checked varchar (3)
DECLARE @defaultdb sysname
IF (@login_name IS NULL)
DECLARE login_curs CURSOR FOR
SELECT p.sid, , p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM
sys.server_principals p LEFT JOIN sys.syslogins l
ON ( = ) WHERE p.type IN ( 'S', 'G', 'U' ) AND <> 'sa'
ELSE
DECLARE login_curs CURSOR FOR
SELECT p.sid, , p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM
sys.server_principals p LEFT JOIN sys.syslogins l
ON ( = ) WHERE p.type IN ( 'S', 'G', 'U' ) AND = @login_name
OPEN login_curs
FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin IF (@@fetch_status = -1)
BEGIN
PRINT 'No login(s) found.'
CLOSE login_curs
DEALLOCATE login_curs
RETURN -1
END
SET @tmpstr = '/* sp_help_revlogin script '
PRINT @tmpstr
SET @tmpstr = '** Generated ' + CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */'
PRINT @tmpstr
PRINT ''
WHILE (@@fetch_status <> -1)
BEGIN
IF (@@fetch_status <> -2)
BEGIN
PRINT ''
SET @tmpstr = '-- Login: ' + @name
PRINT @tmpstr
IF (@type IN ( 'G', 'U'))
BEGIN -- NT authenticated account/group
SET @tmpstr = 'CREA TE LOGIN ' + QUOTENAME( @name ) + ' FROM WINDOWS WITH DEFAULT_DATABASE = [' + @defaultdb + ']'
END
ELSE BEGIN -- SQL Server authentication
-- obtain password and sid
SET @PWD_varbinary = CAST( LOGINPROPERTY( @name, 'PasswordHash' ) AS varbinary (256) ) EXEC sp_hexadecimal @PWD_varbinary, @PWD_string OUT
EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT
-- obtain password policy state
SELECT @is_policy_checked = CASE is_policy_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name
SELECT @is_expiration_checked = CASE is_expiration_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name
SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' WITH PASSWORD = ' + @PWD_string + ' HASHED, SID = ' + @SID_string + ', DEFAULT_DATABASE = [' + @defaultdb + ']'
IF ( @is_policy_checked IS NOT NULL )
BEGIN
SET @tmpstr = @tmpstr + ', CHECK_POLICY = ' + @is_policy_checked
END
IF ( @is_expiration_checked IS NOT NULL )
BEGIN
SET @tmpstr = @tmpstr + ', CHECK_EXPIRA TION = ' + @is_expiration_checked
END
END
IF (@denylogin = 1)
BEGIN -- login is denied access
SET @tmpstr = @tmpstr + '; DENY CONNECT SQL TO ' + QUOTENAME( @name )
END
ELSE IF (@hasaccess = 0)
BEGIN -- login exists but does not have access
SET @tmpstr = @tmpstr + '; REVOKE CONNECT SQL TO ' + QUOTENAME( @name )
END
IF (@is_disabled = 1)
BEGIN -- login is disabled
SET @tmpstr = @tmpstr + '; ALTER LOGIN ' + QUOTENAME( @name ) + ' DISABLE'
END
PRINT @tmpstr
END
FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin END
CLOSE login_curs
DEALLOCATE login_curs
RETURN 0
GO
注意:此脚本会在“master”数据库中创建两个存储
3、运行下面的语句
Use master
EXEC sp_help_revlogin
注:由“sp_help_revlogin”存储过程生成的输出脚本是登录脚本。
此登录脚本创建具有原始安全标识符(SID) 和原始密码的登录。
4、在目标服务器上,启动SQL Server Management Studio,然后连接到您将数据库移动到的SQL
Server 实例。
5、打开新的查询编辑器窗口,然后运行步骤3 中生成的输出脚本。