SQL Server允许使用简单的Copy方式来备份数据库的数据和日志文件吗?答案是肯定的。但前提是数据文件不再被SQL Server使用。
当数据库处于活动状态,你不能简单的copy它的文件,推荐方式是使用完整数据库备份(备份模式)。这是因为数据库的数据和日志文件不能处于非一致状态。这会导致仅仅在事务日志中被修改的数据页可能无法写入数据文件。这也会影响进程中的事务无法提交或是回滚已经写入文件中的数据。
下面是一个简单的例子:
10:00 | Copying of data files start, takes 10 minutes. |
10:05 | A checkpoint occurs, modifies some pages at the beginning of the data file (which have already been copied), and some pages at the end of the data file (yet to be copied). |
10:10 | Copying of data files end, copy of transaction log starts. |
10:15 | Copying of transaction log ends. |
你最后一步是copy事务日志,这就意味着数据文件已经包括了最后一次checkpoint以后的所有更改,但是实际上数据文件仅仅包括部分更改。
Copy一个已经被其他应用程序打开的文件,这种方式是非常有用的,但如上所述,这种方式好像并不适用于备份SQL Server数据库。假如你必须使用Copy方式来替换普通的数据库备份方式的话,推荐的方式是使用sp_detach_db存储过程来分离数据库:
sp_detach_db 'AdventureWorks'
SQL Server在把数据库从SQL Server实例上分离下来之前,会把所有的脏页都写回磁盘。然后,你就可以Copy数据库文件了,这时数据库文件也是处于一致性状态的。然后,你可以使用sp_attach_db来重新附加数据库:
sp_attach_db 'AdventureWorks', 'e:/mssql_data/AdventureWorks/AdventureWorks.mdf', 'e:/mssql_data/AdventureWorks_log.ldf'
假如你的数据库仅仅由数据文件组成,而且再也不需要事务日志文件了,那么使用sp_attach_single_file_db存储过程:
sp_attach_single_file_db 'AdventureWorks', 'e:/mssql_data/AdventureWorks/AdventureWorks.mdf'
当数据库实例处于离线状态时,你也可以安全的Copy数据库文件。
Copy数据库文件这种方式的主要略势是,你不得不把数据库离线一段时间,以便你来Copy数据文件。而且,你也不能使用附加的数据库作为差异备份和事务日志备份的起始点。