这是一个真实的报错,显法数据库文件出现故障,修复难度极大。为保持业务运行,修复过程中已产生新数据。最终通过云服务器备份提取增量数据写回到关键数据表进行数据一致性的恢复。总结部分思路和使用的工具如下:
常规处理方式
1、修复置疑(Suspect)文档,已test_v6为例,使用时请批改成实际数据库
2 、停止sql服务
3、备份数据根文件夹 如D:\test_data
4、删除原数据库data文件夹的log日志文件 例 test_data\ test_v6_log.ldf
5、重新启动SQL Server服务,然后在查询分析器中运行如下命令:
1 2 3 4 5 6 7 8 9 10 11 12 |
Use Master go sp_configure 'allow updates', 1 reconfigure with override go -- 以上命令可通过前图右击服务器>属性在服务器设置中勾选“允许对系统目录直接进行修改”来实现 begin tran update sysdatabases set status = 32768 where name = 'test_v6' --Verify one row is updated before committing commit tran go |
6.停止并重新启动SQL Server服务,然后在查询分析器中运行如下命令:
1 2 3 4 |
use master go DBCC TRACEON(3604) DBCC REBUILD_LOG('test_v6','D:\test_data\test_v6_log.ldf')----确认数据库是否在d盘,不是请修改位置 |
7.停止并重新启动SQL Server服务,然后在查询分析器中运行如下命令:
1 2 3 4 5 6 7 |
use master go update sysdatabases set status = 8 where name = 'test_v6' go sp_configure 'allow updates', 0 reconfigure with override go |
8.运行dbcc checkdb(test_v6) 检查数据库的完整性
若执行结果没有红字报错则修复成功,否则进行第9步修复工作
9.修复数据库
①在查询分析器中运行如下命令:
1 2 3 4 5 |
USE master Go EXEC sp_dboption 'test_v6', 'single user', 'TRUE' go --此步骤为修改数据库为单用户模式 |
②继续执行如下命令:
1 2 3 4 |
DBCC CHECKDB ('test_v6','repair_rebuild') Go --此步骤为修复数据库,执行之后若没有红字报错,则修复成功进入第④步。此语句可重复多次执行;如果一直有红字报错,请执行第③步修复操作 |
③高级修复命令:
1 2 3 |
DBCC CHECKDB ('test_v6','repair_allow_data_loss') Go --此步骤为更高级别修复,可能造成部分数据丢失。此语句可重复多次执行,直至修复成功进入第④步。 |
④修改数据库为多用户模式命令:
1 2 3 |
EXEC sp_dboption 'test_v6', 'single user','FALSE' go --退出前请一定要执行以上语句返回到多用户模式 |
Docker 安装 MSSQL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# 拉取镜像 docker pull mcr.microsoft.com/mssql/server:2017-latest # 运行Docker docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=<YourStrong!Passw0rd>' \ -p 1433:1433 --name sql1 \ -d mcr.microsoft.com/mssql/server:2017-latest # 修改密码 docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P '<YourStrong!Passw0rd>' -Q 'ALTER LOGIN SA WITH PASSWORD="新密码"' # 进入 Docker docker exec -it sql1 "bash" # 进入 SQL Server 命令行 /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P '<YourStrong!Passw0rd>' # 复制本地文件到 Docker中 docker cp /xxx/tb_test.mdf sql1:/opt/ docker cp /xxx/tb_test_log.ldf sql1:/opt/ # 附加分离的数据库 exec sp_attach_db @dbname = 'tb_test' , @filename1 = '/opt/tb_test.mdf', @filename2 = '/opt/tb_test_log.ldf' go # 单文件附加 exec sp_attach_single_file_db 'tb_test', '/opt/tb_test.mdf' go |
工具:DiskGenius 用于读取阿里云挂载的备份数据盘