### 数据库编程实用技巧集锦
#### 概述
本文档汇总了针对SQL Server数据库的一系列实用技巧,涉及从安装过程中的常见问题处理到数据库维护的各个方面,旨在帮助数据库管理员和开发人员更高效地管理与操作数据库。
#### 安装时提示有挂起的操作
在安装SQL Server或SP补丁时,有时会遇到系统提示之前有挂起的安装操作,要求重启的情况,通常这种情况下重启可能无法解决问题。解决办法如下:
1. **注册表路径**:打开注册表编辑器(可以通过运行命令`regedit`),导航至`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager`。
2. **删除挂起记录**:在该路径下找到并删除名为`PendingFileRenameOperations`的键值。
3. **重启计算机**:删除后重启计算机以使更改生效。
#### 收缩数据库及优化
1. **重建索引**:
- `DBCC REINDEX`:用于优化索引结构,提高查询性能。
- `DBCC INDEXDEFRAG`:用于碎片整理,减少磁盘I/O操作,提升效率。
2. **收缩数据和日志文件**:
- `DBCC SHRINKDB`:用于收缩整个数据库的大小。
- `DBCC SHRINKFILE`:用于指定收缩特定的数据或日志文件。
3. **压缩数据库**:
- `DBCC SHRINKDATABASE(dbname)`:压缩指定数据库,减少存储空间占用。
#### 转移数据库给新用户以已存在的用户权限
使用存储过程`sp_change_users_login`来实现数据库用户的迁移,同时保留原用户的权限:
```sql
EXEC sp_change_users_login 'update_one', 'newname', 'oldname';
GO
```
其中`update_one`表示更新类型,`newname`是新用户名,`oldname`是旧用户名。
#### 检查备份集
为了验证备份文件的有效性和完整性,可以使用`RESTORE VERIFYONLY`命令:
```sql
RESTORE VERIFYONLY FROM DISK = 'E:\dvbbs.bak';
```
这将检查备份文件`E:\dvbbs.bak`是否完好无损,但不会将其恢复到数据库中。
#### 修复数据库
当数据库出现损坏时,可以使用`DBCC CHECKDB`命令进行检查和修复:
1. **设置单用户模式**:
```sql
ALTER DATABASE [dvbbs] SET SINGLE_USER;
GO
```
2. **检查并修复数据库**:
```sql
DBCC CHECKDB('dvbbs', REPAIR_ALLOW_DATA_LOSS) WITH TABLOCK;
GO
```
`REPAIR_ALLOW_DATA_LOSS`参数允许执行可能导致数据丢失的修复操作。需要注意的是,只有在确认数据备份完整且可用的情况下才应使用此选项。
3. **恢复多用户模式**:
```sql
ALTER DATABASE [dvbbs] SET MULTI_USER;
GO
```
4. **其他修复选项**:
- `REPAIR_FAST`:执行快速修复,适用于轻微的错误。
- `REPAIR_REBUILD`:执行更全面的修复,可能需要更长时间。
#### SQL Server 日志清除的方法
在实际操作中,数据库日志可能会迅速增大,影响性能。有两种常用的方法来清理日志:
1. **设置数据库为简单模式并收缩日志**:
- 将数据库的恢复模式设为简单模式。
- 使用`DBCC SHRINKFILE`命令收缩日志文件。
- 恢复数据库为完全模式。
2. **手动调整日志文件大小**:
- 使用T-SQL脚本动态调整日志文件大小。
- 示例脚本如下所示:
```sql
SET NOCOUNT ON;
DECLARE @LogicalFileName sysname,
@MaxMinutes INT,
@NewSize INT;
USE databasename; -- 要操作的数据库名
SELECT @LogicalFileName = 'databasename_log', -- 日志文件名
@MaxMinutes = 10, -- Limit on time allowed to wrap log.
@NewSize = 1; -- 你想设定的日志文件的大小 (M)
DECLARE @OriginalSize int;
SELECT @OriginalSize = size
FROM sysfiles
WHERE name = @LogicalFileName;
SELECT 'OriginalSize of ' + db_name() + ' LOG is ' +
CONVERT(VARCHAR(30), @OriginalSize) + ' 8K pages or ' +
CONVERT(VARCHAR(30), (@OriginalSize * 8 / 1024)) + ' MB'
FROM sysfiles
WHERE name = @LogicalFileName;
CREATE TABLE DummyTable (...);
BEGIN TRAN;
INSERT INTO DummyTable (...) VALUES (...);
COMMIT;
DBCC SHRINKFILE (@LogicalFileName, @NewSize);
DROP TABLE DummyTable;
```
通过以上技巧和方法,可以有效提升SQL Server数据库的管理和维护水平,确保系统的稳定运行。