博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL Server的备份和恢复
阅读量:2429 次
发布时间:2019-05-10

本文共 3443 字,大约阅读时间需要 11 分钟。

作者:朱金灿

来源:

 

         在上篇博客中谈了Oracle10g的备份和恢复,今天谈了SQLServer的备份和恢复。和Oracle10g不一样,SQLServer的备份和恢复只有两个级别:数据库级别(针对指定数据库)和记录表级别(针对指定表)。

 

1.     数据库的备份和恢复

        SQL Server的数据库备份并没有对应的工具程序来进行,而是通过执行TranscatSQL的BACKUP DATABASE语句来进行数据库备份。BACKUP DATABASE的语法如下:

BACKUP DATABASE { database_name | @database_name_var }   TO 
[ ,...n ] [
] [ next-mirror-to ] [ WITH { DIFFERENTIAL |
[ ,...n ] } ][;]
      一个简单的例子是:

BACKUP DATABASE  TechInfo  TO DISK = 'E:\Bak\db.bak'-- 把数据库TechInfo备份为'E:\Bak\db.bak'

       同样地,数据库的恢复也通过执行Transcat SQL的RESTORE DATABASE语句来进行数据库备份。RESTORE DATABASE的语法如下:

--To restore a complete database from a full database backup (a Complete Restore):RESTORE DATABASE { database_name | @database_name_var } [ FROM 
[ ,...n ] ][ WITH [ { CHECKSUM | NO_CHECKSUM } ] [ [ , ] { STOP_ON_ERROR | CONTINUE_AFTER_ERROR } ] [ [ , ] FILE = { backup_set_file_number | @backup_set_file_number } ] [ [ , ] KEEP_REPLICATION ] [ [ , ] MEDIANAME = { media_name | @media_name_variable } ] [ [ , ] MEDIAPASSWORD = { mediapassword | @mediapassword_variable } ] [ [ , ] MOVE 'logical_file_name_in_backup' TO 'operating_system_file_name' ] [ ,...n ] [ [ , ] PASSWORD = { password | @password_variable } ] [ [ , ] BLOCKSIZE = { blocksize | @blocksize_variable } ] [ [ , ] BUFFERCOUNT = { buffercount | @buffercount_variable } ] [ [ , ] MAXTRANSFERSIZE = { maxtransfersize | @maxtransfersize_variable } ] [ [ , ] ENABLE_BROKER ] [ [ , ] ERROR_BROKER_CONVERSATIONS ] [ [ , ] NEW_BROKER ] [ [ , ] { RECOVERY | NORECOVERY | STANDBY = {standby_file_name | @standby_file_name_var } } ] [ [ , ] REPLACE ] [ [ , ] RESTART ] [ [ , ] RESTRICTED_USER ] [ [ , ] { REWIND | NOREWIND } ] [ [ , ] { UNLOAD | NOUNLOAD } ] [ [ , ] STATS [ = percentage ] ] [ [ , ] { STOPAT = { 'date_time' | @date_time_var } | STOPATMARK = { 'lsn:lsn_number' } [ AFTER 'datetime' ] | STOPBEFOREMARK = { 'lsn:lsn_number' } [ AFTER 'datetime' ] } ] ][;]
一个简单的例子是:

RESTORE DATABASE  TechInfo  DISK = 'E:\Bak\db.bak'-- 从'E:\Bak\db.bak'恢复数据库TechInfo

2.     记录表备份和恢复

        SQL Server单个表的备份略显复杂。

        第一步通过执行Transcat SQL的EXEC xp_cmdshell语句。EXEC xp_cmdshell的语法如下:

EXEC xp_cmdshell 'bcp \"db_name..table_name\" out  bak_filep_path -c –Sserver_name -U -P%s'
一个例子是:

EXEC xp_cmdshell 'bcp \"TechInfo..student\" out  E:\\student.dmp -c –S\\192.168.1.1 –Uadmin  -P123456'

 第二步,调用SQL Server的组件SQLDMO.dll来动态生成一个建表sql脚本文件,C++代码大致如下:

_SQLServerPtr  l_Server;l_Server.CreateInstance("SQLDMO.SQLServer");/*生成创建表的脚本文件*/		l_Server->Databases->Item((_bstr_t)DbName)->Tables->Item((_bstr_t)TableName)->Script(			SQLDMOScript_Default,			(_bstr_t)SqlScrptPath,    // 脚本文件的存贮路径			(_bstr_t)TableName,    // 给所备份的表起的新名字,这里依然沿用旧名字			SQLDMOScript2_Default);		l_Server->DisConnect();   // 断开连接

          很显然,对单个表的恢复需要用到建表的sql脚本文件和备份的数据文件,具体步骤也分为两步:

a.    执行EXEC xp_cmdshell语句来运行sql脚本文件建表。EXEC xp_cmdshell执行sql脚本的语法如下:

EXEC xp_cmdshell 'osql -U user_name -P password -S server_name -i sql_script_path -d db_name'
一个简单的例子是:
EXEC xp_cmdshell 'osql -U admin -P 123456 -S \\192.168.1.1 -i E:\\bak.sql -d TechInfo'

b.    执行EXEC xp_cmdshell语句来为新建的表导入数据。EXECxp_cmdshell导入表数据的语法如下:

EXEC xp_cmdshell 'bcp \"db_name..table_name\" in bak_file_path -c –Sserver_name –Uuser_name -Ppassword'
一个简单的例子是:
EXEC xp_cmdshell 'bcp \"TechInfo..student\" in E:\\db_bak.dmp -c –S\\192.168.1.1 –Uadmin –P123456'

转载地址:http://nrimb.baihongyu.com/

你可能感兴趣的文章
Python 爬取 13966 条运维招聘信息,这些岗位最吃香
查看>>
28 岁退休程序员自述:不是富二代,行政专业出身,非典型程序员
查看>>
那时刚毕业的我,曾参与惊心动魄 3Q 大战
查看>>
程序员爬取 5000+ 口红商品数据,差点比女朋友更懂口红?
查看>>
30 张图解 | 高频面试知识点总结:面试官问我高并发服务模型哪家强?
查看>>
以太坊创始人V 神:普通人看见现在,天才看见未来
查看>>
厉害!从电影花瓶到 Wi-Fi 之母,这才是乘风破浪的姐姐!
查看>>
中国开源大爆发进行时,你没掉队吧?
查看>>
用 Python 实现抖音上的“人像动漫化”特效,原来这么简单!
查看>>
一周内咸鱼疯转 2.4W 次,最终被所有大厂封杀!
查看>>
关于鸿蒙 2.0,那些开发者不知道的一切
查看>>
Google 排名第一的语言,引数十万人关注:搞定它,技术大牛都甘拜下风
查看>>
JavaScript 爆红后,微软为何还要开发 TypeScript?
查看>>
软件开发行业,年轻与大龄程序员的生存现状
查看>>
王者荣耀活动精选 Blink 第二弹来袭!
查看>>
打开数“智”化之门,一字之差带来的思考
查看>>
阿里技术人的成长路径是什么?
查看>>
你值得拥有!更省钱地完成数据监听
查看>>
漫画 | TCP,一个悲伤的故事
查看>>
张一鸣无圈胜破圈?
查看>>