Sqlserver数据库备份与还原
SQLServer常见问题处理(数据库的备份与还原操作)

数据库备份与还原操作一、备份数据库操作(1) 打开企业管理器,按下图依次打开,然后右击要备份的数据库,按下图选中备份数据库(图1-1 示)。
图1-1(2) 点击删除,然后点击“添加”按钮 (图1-2示)。
图1-2(3) 系统弹出“选择备份目的”窗口,在“文件名(F):”栏中输入或选择备份路径(图1-3示)。
图1-3(4) 系统弹出“备份设置位置”对话框,选择备份路径并键入备份文件名(如:选择D:\DataBase\,文件名为:fjjr_jwgl1db061113。
图1-4示),并点击“确定”。
图1-4(5) 系统回到“SQL Server 备份”窗口,单击“确定”后,系统自动备份数据库,直到系统完成即可完成数据库备份操作。
图1-5二、还原数据库操作(1) 打开企业管理器,按下图依次打开,然后右击要备份的数据库,按下图选中“还原数据库(R)”(图2-1示)。
图2-1(2) 系统弹出“还原数据库”窗口,选择“从设备(M)”单选框(图2-2示)图2-2 (3) 单击“选择设备(E)...”按钮(图2-3示)。
图2-3(4) 系统弹出“选择还原设备”窗口,在此窗口中单击“添加(A)...”按钮(图2-4示)。
图2-4(5) 系统弹出“选择还原目的”窗口,在“文件名(F):”文本框中输入还原目的文件或单击“...”按钮(图2-5示)。
图2-5(6) 单击“...”后,系统弹出“备份设备位置”对话框,选择正确的备份数据库文件 (图2-6示)。
图2-6(7) 依次确定到“还原数据库”窗口,单击“选项”选项卡(图2-7示)图2-7(8) 确认“移至物理文件名”所在具体位置,并选中“在现有数据库上强制还原(F)”复选框,单击“确定”按钮,系统自动还数据数据库,等待直至数据还原完毕(图2-8示)图2-8。
sqlserver备份还原数据库sql语句

sqlserver备份还原数据库sql语句SQL Server备份还原数据库是数据库管理的重要操作之一,可以保障数据库的安全性和可靠性。
本篇文章将详细介绍备份还原数据库的操作流程,包括备份数据库、还原数据库的SQL语句。
以下将一步一步回答。
1. 备份数据库的SQL语句备份数据库是将数据库的数据和日志文件备份到指定的位置以进行数据库恢复。
SQL Server提供了BACKUP DATABASE语句用于备份数据库。
以下是备份数据库的SQL语句示例:BACKUP DATABASE [数据库名称]TO DISK = '备份路径'WITH INIT, FORMAT, NAME = '备份名称'其中,[数据库名称]是要备份的数据库的名称,'备份路径'是备份文件的存储路径,'备份名称'是备份文件的名称。
语句中的WITH INIT表示每次备份都初始化备份介质,FORMAT表示将备份文件格式化,使其可与其他SQL Server版本兼容。
2. 还原数据库的SQL语句还原数据库是将备份的数据库文件恢复到数据库中。
SQL Server提供了RESTORE DATABASE语句用于还原数据库。
以下是还原数据库的SQL语句示例:RESTORE DATABASE [数据库名称]FROM DISK = '备份文件路径'WITH REPLACE, RECOVERY其中,[数据库名称]是要还原的数据库的名称,'备份文件路径'是备份文件的存储路径。
语句中的WITH REPLACE表示在还原数据库之前会替换掉已经存在的同名数据库,RECOVERY表示数据库将处于可使用状态。
3. 备份还原数据库的操作流程备份还原数据库的操作流程包括备份数据库和还原数据库两个步骤。
3.1 备份数据库的操作流程(1)连接到SQL Server数据库。
(2)选择要备份的数据库。
sqlserver还原数据库步骤

sqlserver还原数据库步骤
SQL Server 数据库还原步骤如下:
一、准备工作
1. 确保你拥有对SQL Server的管理员权限;
2. 确保你能够访问要还原的数据库备份文件;
3. 如果要还原的是增量备份文件,请确保已有完整的备份文件。
二、打开SQL Server管理工具
1. 运行管理工具,双击SQL Server Management Studio图标;
2. 在连接对话框中,选择服务器名,选择"Windows身份验证";
3. 在登录界面中输入你的登录用户名和密码;
4. 选择你想还原的数据库;
5. 点击右键进入菜单,根据实际情况点击“任务”→“还原”。
三、还原备份文件
1. 进入还原数据库界面,在“数据库”下拉菜单中选择要还原的数据库;
2. 如果要还原的是增量备份文件,请先在“设备”下拉菜单中选择
“文件浏览器”,然后添加所有的增量备份文件;
3. 如果要还原的是全备,直接选择“设备”下拉菜单中的“备份媒体”;
4. 直接点击“确定”,右侧窗口会出现还原正在进行的信息,并显示
还原的状态,等待还原结束。
四、完成还原
1. 还原完成后,只有该数据库中的表和存储过程被还原,若要还原视
图和用户定义函数,请另外执行SQL脚本;
2. 若要保留现有的数据,则应在“设置”→“还原选项”中选择“使
用现有数据库,同时粘贴备份记录”;
3. 同时,还可以在“设置”→“可选”中针对不同场景设置还原选项,
使之更符合实际情况;
4. 还原完成后,可以使用以上步骤,根据实际情况检查还原的状态。
SQLServer——SQLServer备份与恢复

SQLServer——SQLServer备份与恢复1、动手备份2、动手还原3、T-SQL语句备份及还原BACKUP DATABASERESTORE FILELISTONLY FROM DISK代码示例-- 打开设置当前数据库use mastergo-- 默认创建数据库create database SQLDBgo-- 打开设置当前数据库use SQLDBgoSQLDB-- 在当前数据库创建表create table sqltable(empid char(20) not null primary key,empname char(8) not null,empbd datetime not null default getdate())go-- 将数据信息插入到表中insert into sqltable(empid,empname) values('101','张三') insert into sqltable(empid,empname) values('102','李四') insert into sqltable(empid,empname) values('103','王五') insert into sqltable(empid,empname) values('104','赵三') insert into sqltable(empid,empname) values('105','周北') go-- 查询输出表中所有的记录select *from sqltablego-- 将数据库备份到磁盘设备use SQLDBgobackup database SQLDBto disk='d:\SQLDB.bak'with format,medianame='SQLDB',name='full backup of SQLDB'go-- 还原数据库文件use mastergorestore database SQLDBss from disk='d:\SQLDB.bak' go。
Sqlserver数据库备份和还原

Sqlserver数据库备份和还原数据库的备份数据库备份分为完整备份和差异备份,⾸先理解下什么是完整备份和差异备份:完整备份是指对数据库的全部数据进⾏备份。
差异备份是指将数据库上⼀次完整备份以后到现在为⽌的修改的数据进⾏备份,因此差异备份不能单独使⽤,只能先还原上⼀次的完整备份,然后再还原差异备份。
当我们有多个差异备份的时候,只要使⽤最新的差异备份⽂件就可以了,最新的差异备份⽂件会包含之前的差异备份。
sqlserver的备份可以通过脚本来执⾏,也可以通过图形化界⾯执⾏。
1.脚本执⾏的sql语句如下:--完整备份数据库BACKUP DATABASE Test_Bak TO DISK = 'E:\20181029\bak\Test_bak_full.bak' WITH INIT--差异备份数据库BACKUP DATABASE Test_Bak TO DISK = 'E:\20181029\bak\Test_bak_diff.bak' WITH INIT, DIFFERENTIAL --加上DIFFERENTIAL代表差异备份--事务⽇志备份BACKUP LOG Test_Bak TO DISK = 'E:\20181029\bak\Test_bak_log.bak' WITH INIT --BACKUP LOG表⽰备份事务⽇志,BACKUP DATABASE表⽰完整或差异备份--备份事务⽇志,⽂件名中包含当前时间,适合定时备份DECLARE @strbackup NVARCHAR(100)--改为⽇期加时间的SET @strbackup = 'E:\20181029\bak\Test_bak_log_'+ REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR, GETDATE(), 120), '-', ''), ' ', ''), ':', '') + '.bak'BACKUP LOG Test_Bak TO DISK = @strbackup WITH INIT;GO2.图形化界⾯操作如下:在数据库中,选择要备份的数据库,右键》》任务》》备份在弹出的窗⼝中,根据备份类型,选择完整备份,差异备份还是事务⽇志备份点击确定,即可完成备份⽂件的⽣成。
Sqlserver数据库备份与还原

Sqlserver数据库备份与还原⼀、数据库存储概述1、数据⽂件类型· Primary data files:每个数据库都有⼀个单独的主要数据⽂件,默认以.mdf扩展名。
主要数据⽂件不仅包含数据信息,还包含与该数据库结构相关的信息。
创建数据库时,数据库结构相关信息不仅存在于master数据库中,同时还包含在primary data file上.· Secondary data files⼀个数据库可以有⼀个或者多个⼆级数据⽂件,默认以.ndf为扩展名。
⼀般来说⼆级数据⽂件并不是必须的,因为⼆级数据⽂件不包含⽂件位置等信息。
· Transaction logs: 数据库必须⾄少有⼀个事务⽇志⽂件,默认以.ldf为扩展名。
⽇志是整个数据库的命脉,事务⽇志不可读的话,将⽆法对数据库进⾏任何操作。
当你在数据库上进⾏数据操作时,数据并不是直接写⼊数据⽂件,⽽是先将相关操作信息写⼊事务⽇志⽂件。
当⼀个事务结束时,该事务被标记为已提交,但这也并不意味着数据从⽇志⽂件写⼊了数据⽂件中。
⼀个标记为已提交的事务仅仅意味着所有与该事务相关的元素已经成功完成。
The buffer cache may be updated, but not necessarily the data file.检查点(checkpoint)会周期性的发⽣。
检查点发⽣时,是确认所有已提交的事务,不管是在buffer cache或者事务⽇志中,都被写⼊相关的数据⽂件中。
检查点(checkpoint)可以通过以下⽅式来触发:1、显⽰调⽤checkpoint命令;2、Recover Interval 实例设置的周期达到(⽤来标识多久发⽣⼀次checkpoint)3、做了数据库备份(在简单模式下);4、数据库⽂件结构被改变(在简单模式下);5、数据库引擎被结束。
⼀般来说,写数据的过程是由系统⾃动完成的,如下图所⽰,但数据并不是直接写⼊.mdf或者.ndf ⽂件中,⽽是先将有关变化写⼊事务⽇志中,这也是数据库中的write-ahead机制。
SQLServer数据库的备份和恢复方法
SQLServer数据库的备份和恢复方法作为一名数据库管理员,数据库的备份和恢复是非常重要的工作之一。
数据库是企业中最重要的信息资产之一,如果因为故障或其他原因导致数据丢失,会给企业带来不可估量的损失。
为了避免这种情况的发生,我们需要定期备份数据库,并且掌握好相应的恢复方法。
一、备份方法1、全备份全备份,即备份整个数据库,包括数据文件、事务日志和所有的元数据信息。
全备份是最完整的一种备份方式,备份出来的文件可以还原整个数据库。
全备份的方法和语法如下:BACKUP DATABASE database_name TO backup_device [WITH options];其中,backup_device指备份的目录和文件名,options包括NOFORMAT、NOINIT、NAME、SKIP、REWIND和FORMAT 等选项,可以根据需要进行配置。
例如:BACKUP DATABASE AdventureWorks2016 TO DISK ='C:\AdventureWorks2016.bak' WITH NOFORMAT, NOINIT, NAME = N'AdventureWorks2016-Full Database Backup', SKIP, REWIND, NOUNLOAD, STATS = 10这条命令会将AdventureWorks2016数据库备份到C盘下的AdventureWorks2016.bak文件中,同时还指定了一些选项,比如不要在备份设备上格式化或初始化任何内容,备份名称为AdventureWorks2016-Full Database Backup等。
2、差异备份差异备份,即备份自上次全备份以来发生过更改的数据。
差异备份的好处是备份时间较短,备份文件也较小,但同时也需要保证有完整的全备份文件存在。
差异备份的方法和语法如下:BACKUP DATABASE database_name TO backup_device [WITH DIFFERENTIAL];其中,WITH DIFFERENTIAL表示进行差异备份。
SQLServer数据库备份和恢复
SQLServer数据库备份和恢复作为一位数据库管理员,备份和恢复数据库是日常工作中必不可少的任务。
在SQLServer中,备份和恢复数据库是非常简单而且快速的,但是在备份和恢复过程中需要注意一些要点,本文将对此进行介绍和分析。
一、备份数据库在备份数据库之前,需要了解备份的种类和使用场景。
常见的备份种类有完整备份、差异备份和日志备份。
完整备份是将数据库的所有数据和日志都备份下来,差异备份是在完整备份的基础上备份自上次完整备份之后发生的所有变化,而日志备份是备份从最后一次备份到本次备份之间发生的所有交易记录。
是否进行完整备份,差异备份还是日志备份,取决于数据需要恢复到哪一个时间点以及备份的频率和容量。
完整备份备份的数据和所有交易记录,可以恢复到任意一个时间点;差异备份备份的数据是上次备份之后的所有变化,可以恢复到差异备份之后的任意一个时间点;而日志备份只备份从上次备份到本次备份之间的交易记录,只能在连续的日志备份中进行数据的恢复。
在进行备份之前,需要关闭数据库以保证备份的一致性。
可以使用以下SQL语句进行完整备份:BACKUP DATABASE database_nameTO DISK = 'backup_path\backup_file_name.bak'WITH FORMAT, INIT其中,database_name 是要备份的数据库名称,backup_path 是备份文件的存储路径,backup_file_name 是备份文件的名称。
WITH FORMAT参数表示每次备份都会覆盖之前的备份文件并且重新初始化备份集,INIT参数表示让备份文件从头开始,不保存之前的任何备份数据。
需要进行差异备份时,可以使用以下SQL语句:BACKUP DATABASE database_nameTO DISK = 'backup_path\backup_file_name.diff'WITH DIFFERENTIAL其中,DIFFERENTIAL参数表示进行差异备份。
sqlserver数据库的备份与恢复sql实现
sqlserver数据库的备份与恢复sql实现sqlserver数据库的备份与恢复sql实现利用T-SQL语句,实现数据库的备份与还原的功能体现了SQL Server中的四个知识点:1.获取SQL Server服务器上的默认目录2.备份SQL语句的使用3.恢复SQL语句的使用,同时考虑了强制恢复时关闭其他用户进程的处理4.作业创建SQL语句的使用/*1.--得到数据库的文件目录@dbname 指定要取得目录的数据库名如果指定的数据不存在,返回安装SQL时设置的默认数据目录如果指定NULL,则返回默认的SQL备份目录名*//*--调用示例select 数据库文件目录=dbo.f_getdbpath('tempdb'),[默认SQL SERVER数据目录]=dbo.f_getdbpath(''),[默认SQL SERVER备份目录]=dbo.f_getdbpath(null)--*/if exists (select * from dbo.sysobjects where id =object_id(N'[dbo].[f_getdbpath]') and xtype in (N'FN', N'IF', N'TF')) drop function [dbo].[f_getdbpath]GOcreate function f_getdbpath(@dbname sysname)returns nvarchar(260)assqlserver数据库的备份与恢复sql实现begindeclare @re nvarchar(260)if @dbname is null or db_id(@dbname) is nullselect @re=rtrim(reverse(filename)) from master..sysdatabases where name='master' elseselect @re=rtrim(reverse(filename)) from master..sysdatabases where name=@dbnameif @dbname is nullset @re=reverse(substring(@re,charindex('/',@re)+5,260))+'BACKUP' elseset @re=reverse(substring(@re,charindex('/',@re),260))return(@re)endgo/*2.--备份数据库*//*--调用示例--备份当前数据库exec p_backupdb @bkpath='c:/',@bkfname='db_/DATE/_db.bak'--差异备份当前数据库exec p_backupdb@bkpath='c:/',@bkfname='db_/DATE/_df.bak',@bktype='DF' --备份当前数据库日志exec p_backupdb@bkpath='c:/',@bkfname='db_/DATE/_log.bak',@bktype='LOG' --*/if exists (select * from dbo.sysobjects where id =object_id(N'[dbo].[p_backupdb]') and __(id, N'IsProcedure') = 1) sqlserver数据库的备份与恢复sql实现drop procedure [dbo].[p_backupdb]GOcreate proc p_backupdb@dbname sysname='', --要备份的数据库名称,不指定则备份当前数据库@bkpath nvarchar(260)='', --备份文件的存放目录,不指定则使用SQL 默认的备份目录@bkfname nvarchar(260)='', --备份文件名,文件名中可以用/DBNAME/代表数据库名,/DATE/代表日期,/TIME/代表时间@bktype nvarchar(10)='DB', --备份类型:'DB'备份数据库,'DF' 差异备份,'LOG' 日志备份@appendfile bit=1 --追加/覆盖备份文件asdeclare @sql varchar(8000)if isnull(@dbname,'')='' set @dbname=db_name()if isnull(@bkpath,'')='' set @bkpath=dbo.f_getdbpath(null)if isnull(@bkfname,'')='' set@bkfname='/DBNAME/_/DATE/_/TIME/.BAK' set@bkfname=replace(replace(replace(@bkfname,'/DBNAME/',@dbname) ,'/ DATE/',convert(varchar,getdate(),112)),'/TIME/',replace(convert(varchar,getdate(),108),':',''))set @sql='backup '+case @bktype when 'LOG' then 'log ' else'database ' end +@dbname+' to disk='''+@bkpath+@bkfname+''' with '+case @bktype when 'DF' then '__NTIAL,' else '' end+case @appendfile when 1 then 'NOINIT' else 'INIT' endprint @sqlexec(@sql)go/*3.--恢复数据库sqlserver数据库的备份与恢复sql实现/*--调用示例--完整恢复数据库exec p_RestoreDb @bkfile='c:/db_2022年1015_db.bak',@dbname='db'--差异备份恢复exec p_RestoreDb@bkfile='c:/db_2022年1015_db.bak',@dbname='db',@retype='DBNOR'exec p_backupdb @bkfile='c:/db_2022年1015_df.bak',@dbname='db',@retype='DF'--日志备份恢复exec p_RestoreDb@bkfile='c:/db_2022年1015_db.bak',@dbname='db',@retype='DBNOR'exec p_backupdb @bkfile='c:/db_2022年1015_log.bak',@dbname='db',@retype='LOG'--*/if exists (select * from dbo.sysobjects where id =object_id(N'[dbo].[p_RestoreDb]') and __(id, N'IsProcedure') = 1) drop procedure [dbo].[p_RestoreDb]create proc p_RestoreDb@bkfile nvarchar(1000), --定义要恢复的备份文件名@dbname sysname='', --定义恢复后的数据库名,默认为备份的文件名@dbpath nvarchar(260)='', --恢复后的数据库存放目录,不指定则为SQL的默认数据目录@retype nvarchar(10)='DB', --恢复类型:'DB'完事恢复数据库,'DBNOR' 为差异恢复,日志恢复进行完整恢复,'DF' 差异备份的恢复,'LOG' 日志恢复@filenumber int=1, --恢复的文件号@overexist bit=1, --是否覆盖已经存在的数据库,仅@retype为@killuser bit=1 --是否关闭用户使用进程,仅@overexist=1时有效asdeclare @sql varchar(8000)sqlserver数据库的备份与恢复sql实现--得到恢复后的数据库名if isnull(@dbname,'')=''select @sql=reverse(@bkfile),@sql=case when charindex('.',@sql)=0 then @sqlelse substring(@sql,charindex('.',@sql)+1,1000) end,@sql=case when charindex('/',@sql)=0 then @sqlelse left(@sql,charindex('/',@sql)-1) end,@dbname=reverse(@sql)--得到恢复后的数据库存放目录if isnull(@dbpath,'')='' set @dbpath=dbo.f_getdbpath('')--生成数据库恢复语句set @sql='restore '+case @retype when 'LOG' then 'log ' else'database ' end+@dbname +' from disk='''+@bkfile+''''+' with file='+cast(@filenumber as varchar)+case when @overexist=1 and @retype in('DB','DBNOR') then',replace' else '' end +case @retype when 'DBNOR' then ',__ERY' else ',__Y' end print @sql--添加移动逻辑文件的处理if @retype='DB' or @retype='DBNOR'begin--从备份文件中获取逻辑文件名declare @lfn nvarchar(128),@tp char(1),@i int--创建临时表,保存获取的信息create table #tb(ln nvarchar(128),pn nvarchar(260),tp char(1),fgn nvarchar(128),sz numeric(20,0),Msz numeric(20,0))--从备份文件中获取信息insert into #tb exec('restore filelistonly from disk='''+@bkfile+'''')declare #f cursor for select ln,tp from #tbopen #fsqlserver数据库的备份与恢复sql实现set @i=0while @@fetch_status=0beginselect @sql=@sql+',move '''+@lfn+''' to'''+@dbpath+@dbname+cast(@i as varchar) +case @tp when 'D' then '.mdf''' else '.ldf''' end,@i=@i+1fetch next from #f into @lfn,@tpendclose #fdeallocate #fend--关闭用户进程处理if @overexist=1 and @killuser=1begindeclare @spid varchar(20)declare #spid cursor forselect spid=cast(spid as varchar(20)) from master..sysprocesses where dbid=db_id(@dbname)open #spidwhile @@fetch_status=0beginexec('kill '+@spid)fetch next from #spid into @spidendclose #spiddeallocate #spidend--恢复数据库exec(@sql)gosqlserver数据库的备份与恢复sql实现/*4.--创建作业*//*--调用示例--每月执行的作业exec p_createjob @jobname='mm',@sql='select * from syscolumns',@freqtype='month'--每周执行的作业exec p_createjob @jobname='ww',@sql='select * from syscolumns',@freqtype='week'--每日执行的作业exec p_createjob @jobname='a',@sql='select * from syscolumns'--每日执行的作业,每天隔4小时重复的作业exec p_createjob @jobname='b',@sql='select * fromsyscolumns',@fsinterval=4--*/if exists (select * from dbo.sysobjects where id =object_id(N'[dbo].[p_createjob]') and __(id, N'IsProcedure') = 1) drop procedure [dbo].[p_createjob]GOcreate proc p_createjob@jobname varchar(100), --作业名称@sql varchar(8000), --要执行的命令@dbname sysname='', --默认为当前的数据库名@freqtype varchar(6)='day', --时间周期,month 月,week 周,day 日@fsinterval int=1, --相对于每日的重复次数@time int=__ --开始执行时间,对于重复执行的作业,将从0点到23:59分asif isnull(@dbname,'')='' set @dbname=db_name()sqlserver数据库的备份与恢复sql实现--创建作业exec msdb..sp_add_job @job_name=@jobname--创建作业步骤exec msdb..sp_add_jobstep @job_name=@jobname,@step_name = '数据处理',@subsystem = 'TSQL',@database_name=@dbname,@command = @sql,@retry_attempts = 5, --重试次数@retry_interval = 5 --重试间隔--创建调度declare @ftype int,@fstype int,@ffactor intselect @ftype=case @freqtype when 'day' then 4when 'week' then 8when 'month' then 16 end,@fstype=case @fsinterval when 1 then 0 else 8 endif @fsinterval1 set @time=0set @ffactor=case @freqtype when 'day' then 0 else 1 end EXEC msdb..sp_add_jobschedule @job_name=@jobname, @name = '时间安排',@freq_type=@ftype , --每天,8 每周,16 每月@freq_interval=1, --重复执行次数@freq_subday_type=@fstype, --是否重复执行@freq_subday_interval=@fsinterval, --重复周期@freq_recurrence_factor=@ffactor,@active_start_time=@time --下午17:00:00分执行go/*--应用案例--备份方案:sqlserver数据库的备份与恢复sql实现完整备份(每个星期天一次)+差异备份(每天备份一次)+日志备份(每2小时备份一次)调用上面的存储过程来实现--*/declare @sql varchar(8000)--完整备份(每个星期天一次)set @sql='exec p_backupdb @dbname=''要备份的数据库名'''exec p_createjob @jobname='每周备份',@sql,@freqtype='week'--差异备份(每天备份一次)set @sql='exec p_backupdb @dbname=''要备份的数据库名'',@bktype='DF'' exec p_createjob @jobname='每天差异备份',@sql,@freqtype='day'--日志备份(每2小时备份一次)set @sql='exec p_backupdb @dbname=''要备份的数据库名'',@bktype='LOG''exec p_createjob @jobname='每2小时日志备份',@sql,@freqtype='day',@fsinterval=2/*--应用案例2生产数据核心库:__备份方案如下:1.设置三个作业,分别对__库进行每日备份,每周备份,每月备份2.新建三个新库,分别命名为:每日备份,每周备份,每月备份3.建立三个作业,分别把三个备份库还原到以上的三个新库。
SQLServer数据库备份和还原——使用sqlcmd
SQLServer数据库备份和还原——使⽤sqlcmd备份BACKUP DATABASE AbpFirst TO DISK='d:\AbpFirst.bak'还原RESTORE DATABASE AbpFirst FROM DISK='d:\AbpFirst.bak'使⽤sqlcmd命令则要加上连接信息:备份sqlcmd -S . -E -Q "BACKUP DATABASE AbpFirst TO DISK='d:\AbpFirst.bak'"还原sqlcmd -S . -E -Q "RESTORE DATABASE AbpFirst FROM DISK='d:\AbpFirst.bak'"以上的还原命令,如果备份和还原在同⼀台SqlServer 服务器上,则没有问题;但是,如果是在另⼀台SqlServer 服务器上还原该备份⽂件,则会报错。
因为还原的时候会验证备份时数据⽂件的路径。
这时,我们需要使⽤WITH MOVE 重新映射数据⽂件和⽇志⽂件:sqlcmd -S .\sqlexpress -E -Q "RESTORE DATABASE AbpFirst FROM DISK='D:\AbpFirst.bak'WITH MOVE 'AbpFirst'TO'D:\MyData\AbpFirst_Data.mdf', Move 'AbpFirst_log'TO'D:\MyData\AbpFirst_log.ldf'"如果我们不知道数据⽂件和⽇志⽂件的名称,可以使⽤下⾯的命令查询:sqlcmd -S .\sqlexpress -E -Q "RESTORE FILELISTONLY FROM DISK='d:\AbpFirst.bak'"。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、数据库存储概述1、数据文件类型· Primary data files:每个数据库都有一个单独的主要数据文件,默认以.mdf扩展名。
主要数据文件不仅包含数据信息,还包含与该数据库结构相关的信息。
创建数据库时,数据库结构相关信息不仅存在于master数据库中,同时还包含在primary data file上.· Secondary data files一个数据库可以有一个或者多个二级数据文件,默认以.ndf为扩展名。
一般来说二级数据文件并不是必须的,因为二级数据文件不包含文件位置等信息。
· Transaction logs: 数据库必须至少有一个事务日志文件,默认以.ldf为扩展名。
日志是整个数据库的命脉,事务日志不可读的话,将无法对数据库进行任何操作。
当你在数据库上进行数据操作时,数据并不是直接写入数据文件,而是先将相关操作信息写入事务日志文件。
当一个事务结束时,该事务被标记为已提交,但这也并不意味着数据从日志文件写入了数据文件中。
一个标记为已提交的事务仅仅意味着所有与该事务相关的元素已经成功完成。
The buffer cache may be updated, but not necessarily the data file.检查点(checkpoint)会周期性的发生。
检查点发生时,是确认所有已提交的事务,不管是在buffer cache或者事务日志中,都被写入相关的数据文件中。
检查点(checkpoint)可以通过以下方式来触发:1、显示调用checkpoint命令;2、Recover Interval 实例设置的周期达到(用来标识多久发生一次checkpoint)3、做了数据库备份(在简单模式下);4、数据库文件结构被改变(在简单模式下);5、数据库引擎被结束。
一般来说,写数据的过程是由系统自动完成的,如下图所示,但数据并不是直接写入.mdf或者.ndf 文件中,而是先将有关变化写入事务日志中,这也是数据库中的write-ahead机制。
1. 用户执行insert, update, delete等语句;2. 数据立即被写入内部日志缓存中(internal log cache)3. 日志缓存会更新物理事务日志文件,同时将在buffer cache上执行相关变化4.数据缓存(data buffer)清除所有在缓存上的脏数据,数据文件被更新。
1、恢复模式类型所有的数据库都可以设置为三个不同的恢复模式:简单(simple),完全(full),大容量日志(Bulk-Logged).A完全恢复模式完全恢复模式是默认的恢复模式。
在完全恢复模式下,需要手工的对事务日志进行管理。
使用完全恢复模式的优点是可以恢复到数据库失败或者指定的时间点上。
缺点则是,如果没有进行管理的话,事务日志将会快速增长,消耗磁盘空间。
要清除事务日志,只能通过备份事务日志,或者切换至简单模式。
如上图所示,在完全恢复模式下,事务日志会持续增长,而不管checkpoint的发生。
B简单恢复模式与完全恢复模式不同的是,在简单恢复模式下,在检查点发生时(checkpoint),当前已被提交的事务日志将会被清除。
如上图所示,在检查点发生时,所有已提交的事务日志信息将会从事务日志里面删除。
因此,在简单恢复模式下,容易造成数据丢失,因为无法将数据库恢复到失败的那一刻。
需要注意的是,虽然在简单恢复模式下,系统会自动定期清除日志,但这并不意味着事务日志文件不会增长。
例如,如果执行一个批量插入操作时,SQL SERVER会将该相关操作当成一个事务,期间产生的日志量在极端情况下,还是非常可观的。
C大容量日志恢复模式大容量日志恢复模式与完全恢复模式非常相似,但与完全恢复模式不同的是,批量操作将会尽量被最少记录。
批量操作有以下几种类型:1. 批量导入数据,例如使用BCP(Bulk Copy Import) ,BULK INSERT命令,或者是在BULK 使用OPENROWSET命令;2. 大对象操作(LOB),例如在TEXT, NTEXT, IMAGE 列上使用WRITETEXT 或者UPDATETEXT;3. SELECT INTO 字句;4. CREATE INDEX, ALTER INDEX, ALTER INDEX REBUILD, DBCC REINDEX在完全恢复模式下,上述操作产生的日志将会是非常大的。
而使用大容量日志恢复模式将会阻止不需要或者非预期的日志增长。
在批量操作发生时,SQL SERVER仅仅记录了相关数据页(data page)的ID,在SQL SERVER中,SQL SERVER pages 都有内部ID,如5:547。
用这种方式,能够将大量的page ID记录在小的日志文件里。
使用大容量日志恢复模式,将会使数据仓库或者有大批量操作的数据库减少很大的空间。
但使用大容量恢复模式时,会使得恢复变得比较困难,一般来说,只能恢复到最后的事务日志备份点上,但如果所有的事务日志都被备份后,还是可以恢复成功的。
只要在必要时才使用大容量恢复模式,而且使用完成后,还需切换至完全恢复模式,同时进行备份。
2、改变恢复模式改变数据库的恢复模式,可以通过以下语句来实现:ALTER DATABASE database_name SET RECOVEY BULK_LOGGED也可以通过GUI界面来修改。
改变恢复模式并不需要重启数据库实例。
二、数据库备份介绍1、备份位置在SQL Server上,有多种备份位置可以选择,如本地磁盘,网络磁盘,远程地址,磁带等。
各种备份位置均有自己的优点和缺点。
2、逻辑备份设备在SQL Server上,可以通过创建逻辑备份设备来完成备份。
使用逻辑备份设备的好处是,当变更备份地址时,不需要更改备份脚本,只需要更改逻辑备份设备的定义即可。
创建逻辑备份设备的脚本如下:SQL codeEXEC sp_adddumpdevice@devtype=’disk’,@logicalname=’MYBackup’,@physicalname=’D:\backup\mydb.bak’删除备份设备的脚本:SQL codeSp_dropdevice@logicalname=’MYBackup’上述脚本只是删除逻辑备份设备的定义,下述脚本将同时删除备份文件:SQL codeSp_dropdevice@logicalname=’MYBackup’,@devfile=’DELFILE’使用逻辑备份设备的方法如下:SQL codeBackup database mydb to MYBackup当然,还可在逻辑备份设备上指定过期时间等备份属性,如:SQL codeBackup database mydb to MYBackup WITHEXPIREDATE=’13/01/2010’或:SQL codeBACKUP DATABASE mydb to MYBackup WITHRETAINDAYS=73、备份集与存储集每一份备份包含于一个备份集,而一个备份集包含于一个存储集。
通过系统GUI进行备份时,SQL Server会自动指定备份集和存储集,目的则是为了简化管理。
用T-SQL显示指定则用如下语法:SQL codeBACKUP DATABASE mydb to MYBackup WITHRETAINDAYS=7,NAME=’FULL’,MEDIANAME=’ALLBackups’NAMEs是指备份集名称,MEDIANAME是指存储集名称。
4、全备份不管恢复模式是哪一个,所有的备份都必须要有一个全备份,特别是日志备份和差异备份,如果没有全备份的话,将无法进行恢复。
简单的全备份脚本如下所示,也可以通过维护计划来指定全备份:SQL codeBACKUP DATABASE mydb toDISK=’D:\Backup\mydb.bak’但需要注意的是,上述命令是将数据库备份附加到当前的存在的文件上,如果不存在则创建它,并不会覆盖原有文件。
要覆盖同名的备份文件,需要指定INIT参数。
SQL codeBACKUP DATABASE mydb toDISK=’D:\Backup\mydb.bak’ WITH INIT 5、日志备份在完全恢复模式或者大容量日志恢复模式下,日志备份不仅仅是恢复的需要,同时也是手工管理事务日志文件的一种方式。
如果从不进行备份的话,在完全恢复模式或者大容量恢复模式下,事务日志将会持续增长,直至消耗完所在磁盘。
日志备份的脚本如下:SQL codeBACKUP LOG mydb_log TODISK=’D:\backup\mydb.trn’需要养成使用.trn为日志备份的扩展名的习惯。
每个在数据库上的动作都会被安排一个Log Sequence Number (LS N)。
如果需要还原到指定的时间点,需要有持续的LS N记录。
也就是说,在完全恢复模式或者大容量日志模式下,一个不被打断的事务日志备份链是恢复数据库的基本要求。
6、差异备份使用日志备份来恢复时,无疑是一个很慢的过程,特别是上一个全备份的历史比较悠久时。
使用差异备份,便能缩短恢复时间。
事实上,差异备份只是BACKUP DATABASE的一个选项,如下:SQL codeBACKUP DATABASE mydb TODISK=’D:\backup\mydb.dif’ WITHDIFFERENTIAL,INIT进行数据库恢复时,先恢复数据库全备份,再恢复数据库差异备份,最后才恢复日志备份。
差异备份是与上一次全备份紧密相连的,不管期间有多少次日志备份和差异备份,差异备份还是会从上一次全备开始备份。
因此,经常会遇到这样的一种情况,在生产库上需要临时使用数据库时,便用BACKUP DATABASE … TO DIS K=’..’进行了一个备份,下一次的差异备份便会以这回的全备为准,如果过后把这个临时全备删除掉后,后面的差异备份就没用了。
差异备份并不意味着磁盘空间肯定会少,这取决于实际情况。
当期间大量操作发生时,差异备份还是会变得很大。
7、错误检测在备份过程中,备份进程会同时验证数据,或者校验不完整页(torn page),或者验证校验和(checksum)。
要使用该功能,需要激活该选项。
不完整页检测(Torn-page dection)仅仅检查每一个页看是否已经写完成。
如果发现一个页只有部分被写入,那么就将其标记为torn。
校验和验证(checksum validation)是一种新的页验证机制。
它会为每个页添加一个值来表明该页实际的大小。
虽然看起来是个代价很高影响性能的操作,但事实上,它的效率非常高,与torn-page 差不多。