原文出处:http://blog.csdn.net/langzxz/article/details/9093877
Sql sever有这么一功能
备份SqlServer数据库
Backup Database [数据库] To disk='c:\mysql.bak' With Password = '123',init;
恢复SqlServer数据库
Restore Database [数据库] From disk='c:\mysql.bak' With Password = '123';
但是忘记密码后怎么还原数据库?
在备份文件SSET结构中,也就是sql2005备份文件的第三扇区。第0x7a(一般是这样)字节开始16个字节就是密码。
圈出来的偏移72字节 Data Set Password 就是记录密码的地址,User Name 就是做备份的用户。
通过语句备份一个有密码保护的数据库,然后用第三扇区的0x7a字节开始的16字节copy到要恢复的不知道密码的备份文件的相同位置覆盖。
然后
Restore Database [aa] From disk='H:\data\data.bak'WITH FILE = 1, NOUNLOAD, REPLACE, STATS = 10,MOVE 'dzsc' TO'g:\aa.mdf', MOVE 'dzsc_log' TO 'g:\aa_log.ldf',Password = '已知密码';
FILE = 1数据文件的id
'dzsc','dzsc_log'库文件的逻辑名,如果不知道,去掉(MOVE 'dzsc' TO 'g:\aa.mdf', MOVE 'dzsc_log' TO'g:\aa_log.ldf'),执行一下语句就知道了。
同一个库 做两个无密码备份,一个密码为1的备份,一个密码为2的备份
通过两个无密码文件对比知道哪里有差异,a
通过一个无密码和一个有密码文件对比,知道哪里有差异 b1
通过一个无密码和另一个有密码文件对比,知道哪里有差异 b2
a和b1的差异有多大,差异最大的位置在哪里。T1
a和b2的差异有多大,差异最大的位置在哪里.T2
发现T1=T2.
将其中一个有密码备份的T1位置的数据(16字节)换成另一个有密码备份的T2位置的数据,
执行Restore Database [数据库] From disk='c:\mysql.bak' With Password = '123';
根据提示的错误修改sql语句,最后得到
Restore Database [aa] From disk='H:\data\data.bak'WITH FILE = 1, NOUNLOAD, REPLACE, STATS = 10,MOVE 'dzsc' TO'g:\aa.mdf', MOVE 'dzsc_log' TO 'g:\aa_log.ldf',Password = '已知密码';
还原成功!