如何压缩MSSQL数据库日志的大小

如何压缩MSSQL数据库日志的大小,第1张

数据库在日积月累的 *** 作过程中,不但自身体积会慢慢增长,其日志的容量大小同样也随着数据库实体文件的增长而增长,且会占用很大的空间MSSQL数据库的大小包含数据(Data)和事务日志(TransactionLog)两个部分。 数据部分存储的是用户数据库中的数据,包含用户的数据表、视图、存储过程等等内容。数据部分一般存储与数据库文件组中的mdb文件中。一般来说,在正常使用的情况下,这个部分的大小不会经常性地发生很大的变化,除非是用于存储论坛之类快速变化的数据内容。一般而言,这个部分很少会需要缩小。 事务日志存储的是用户数据库 *** 作的事务记录,主要是用于在数据库服务器发生故障(比如电源故障之后),恢复数据库中的数据完整性而用的。这个部分一般存储于数据库文件组中的ldf文件中。这个部分的大小经常会发生剧烈的变化。 在某些情况下,由于用户的查询语句(SQL语句)书写的问题,会造成数据库文件大小的急剧膨胀,尤其是日志文件会变得非常大。这个时候需要对数据库加以缩小。缩小的 *** 作分为两个步骤: 步骤一 截断数据库中的日志内容

如果你使用的是虚拟主机的MSSQL数据库,你是不用做太多配置的,因为主要的配置工作是需要在服务器上完成的,你现在有的这些选项是站长常规维护用的,下面的方法是需要你的虚拟主机商 *** 作的,你可以让他尝试下,如果还是不可以,再看有什么办法,我一向使用的是MYSQL,所以对MSSQL不是特别的熟悉,不知道能不能帮到你!单行分割线下面是另一个解决方法,也可以参考下

方法一

问题原因:

把数据库备份还原到另一个服务器时,可能会产生孤立用户的问题;

解决办法:

步骤:

1把备份的数据库还原到新的数据库服务器中(11企业管理器-->12数据库(右键)-->13所有任务-->14还原数据库-->15常规/还原为数据库/写上你要的数据库名字xxxx/选中从设备/选择设备/添加(浏览找到你的数据库备份文件)/确定/确定/确定-->16选项-->17将数据库还原为f:\usr\xxxxmdf一般存放在你sql安装的目录下如:d:\Program Files\Microsoft SQL Server\MSSQL\Data\xxxxmdf-->18确定就ok了!!

2 查看你刚刚还原的数据库中的用户如:abc;

3 查看安全性下面的登陆用户中是否有:abc如果没有此时的abc就是一个孤立用户;

4打开查询分析器运行脚本

use 数据库名

go

DECLARE @sid BINARY(16)

SELECT @sid=sid FROM sysusers WHERE name='abc' and islogin=1

exec sp_addlogin @loginame = 'abc',@sid = @sid

5注意,应该是先还原,如果事先在sql的安全性--登录中已经创建abc这个登录,则先删除它,再执行上面的语句同过上面的就能解决问题了!======================================================================

总结:孤立用户疑难解答

把数据库备份还原到另一个服务器时,可能会遇到孤立用户的问题。下面的方案显示解决了这个问题:

通过执行sp_addlogin,把登录 janetl 改名为 dbo。

sp_addlogin 'janetl', 'dbo'

备份数据库。在本例中,备份 Northwind。

BACKUP DATABASE Northwind

TO DISK = 'c:\mssql\backup\northwnd'

除去刚刚备份的数据库。

DROP DATABASE Northwind

除去登录。

sp_droplogin 'janetl'

还原备份的数据库。

RESTORE DATABASE Northwind

FROM DISK = 'c:\mssql\backup\northwnd'

janetl 登录不能访问 Northwind 数据库,除非允许 guest 登录。尽管 janetl 登录已经删除,它仍然(作为一个孤立行)显示在 sysusers 表中:

USE Northwind

SELECT

FROM sysusers

WHERE name = 'janetl'

解决孤立用户问题

用 sp_addlogin 添加一个临时登录。为孤立用户指定安全标识符(SID)(从 sysusers)。

sp_addlogin @loginame = 'nancyd',@sid = 0x32C864A70427D211B4DD00104B9E8A00

用 sp_dropalias 除去属于别名 SID 的临时别名。

sp_dropalias 'nancyd'

用 sp_dropuser 除去原始用户(即现在的孤立用户)。

sp_dropuser 'janetl'

用 sp_dropuser 除去原始登录。

sp_droplogin 'nancyd'

========================================

孤立用户的产生演示

创建一个测试的数据库

CREATE DATABASE DB_test

go

创建一个登录

EXEC sp_addlogin 'aa'

设置登录 aa 的默认数据库为测试数据库 DB_test

EXEC sp_defaultdb 'aa','DB_test'

go

切换到测试数据库

USE DB_test

go

为登录 aa 在当前测试数据库中添加用户

EXEC sp_grantdbaccess 'aa'

go

至此,用户 aa 登录后,其默认的当前数据库就是 DB_test

我们可以在查询分析器,使用用户 aa 登录一下,来验证我们的测试环境

备份测试数据库,为下面的测试做准备

{

BACKUP DATABASE DB_test TO DISK='c:\DB_testbak' WITH INIT

go

/=================== 产生孤立用户 ======================/

切换到 master 数据库

USE master

go

删除测试数据库

DROP DATABASE DB_test

go

删除登录 aa

EXEC sp_droplogin 'aa'

go

/=================== 孤立用户表现形式1 ======================/

还原测试数据库

RESTORE DATABASE DB_test FROM DISK='c:\DB_testbak'

go

切换到测试数据库

USE DB_test

go

查看用户信息

select name from sysusers where islogin=1

我们会发现,虽然我们已经将登录 aa 删除了,但用户 aa 仍然存在于数据库中

尝试一下,用 aa 登录,被告知登录失败

go

再把删除的登录添加回去

EXEC sp_addlogin 'aa'

设置登录 aa 的默认数据库为测试数据库 DB_test

EXEC sp_defaultdb 'aa','DB_test'

再次登录,被告知无法打开默认数据库,登录失败

go

于是把默认数据库改为 master

EXEC sp_defaultdb 'aa','master'

这次再登录,就可以登录了

go

尝试切换到测试数据库 DB_test

USE DB_test

得到错误信息: 服务器用户 'aa' 不是数据库 'DB_test' 中的有效用户。

看来用户 aa 与登录 aa 失去了联系

go

尝试重新为登录 aa 添加用户 aa

EXEC sp_grantdbaccess 'aa'

得到错误信息:当前数据库中已存在用户或角色 'aa'。

这次我们换个顺序,先建立登录,再恢复数据库,看能否使登录与用户自动建立回联系

做这个测试之前,先清理测试环境,即做前面的<产生孤立用户>步骤,然后再开始测试

先添加登录

EXEC sp_addlogin 'aa'

go

还原测试数据库

RESTORE DATABASE DB_test FROM DISK='c:\DB_testbak'

go

切换到测试数据库

USE DB_test

go

查看用户信息

select name from sysusers where islogin=1

我们会发现,用户aa存在于数据库中

尝试一下,用aa登录,并切换到 DB_test

结果是登录成功,访问DB_test出现和测试1一样的错误

for SQL Server 错误 '80040e37'

对象名 'Dv_User' 无效。

/asp,行

先查看了一下数据库表,确实有这个表存在,而且程序中调用语句也没错

重写了一下代码,结果还是一样

怀疑不是程序的问题,于是看其他页面,发现所有的页面都有类似的问题,只要有调用到数据库的地方,都会出现错误判断是数据库出现了问题数据库链接没错导入也没错

go了一把,就解决了

把所有表的所有者改为DBO即可。

执行下面语句,更改所有表的所有者为DBO

exec sp_msforeachtable "sp_changeobjectowner '','dbo'"

在如何修改数据库所有者的 *** 作上出现了点曲折,做总结如下:

1:只需 运行sp_changeobjectowner '表名','dbo'即可;

2但要将所有的表的所有者都改为dbo,可以用循环处理,此处略;

3其实用SQL的系统存储过程sp_MSForEachTable可以轻松搞定,只需运行

exec sp_MSForEachTable 'sp_changeobjectowner '''', ''dbo'''。

当然,可能运行时会有错误出现,(比如有些表的所有者原先就是dbo,会提示“因为新所有者 'dbo' 已有同名的对象。”),再次运行该语句一遍。

------------------------------------------------------------------------------------------------------------------------------------

方法二

Microsoft VBScript 编译器错误 错误 '800a03f6'

缺少 'End'

/iisHelp/common/500-100asp,行242

Microsoft OLE DB Provider for SQL Server 错误 '80040e37'

对象名 'X__Siteconfig' 无效。

/rc/conn/connasp,行16

先查看了一下数据库表,确实有这个表存在,而且程序中调用语句也没错

重写了一下代码,结果还是一样

怀疑不是程序的问题,于是看其他页面,发现所有的页面都有类似的问题,只要有调用到数据库的地方,都会出现错误

判断是数据库出现了问题数据库链接没错

导入也没错

百度一下:

把所有表的所有者改为DBO就OK了

SQL如何更改所有表的所有者

单个修改所有者sql语句如下:

查询分析器输入:EXEC sp_changeobjectowner 'usertable', 'dbo'

usertable的意思为:所有者表名,比如oblogoblog_user,以前的语句表示将table这张表的所有者由

user改成dbo

批量修改所有者语句如下:

查询分析器输入:exec sp_msforeachtable 'sp_changeobjectowner "", "dbo"'

即可把当面表的所有所有者换成dbo

假设你的EXCEL都已经是标准格式的文件了,那么你可以使用以下代码进行 *** 作:

变量定义及ADO对象创建

strConn = "Provider=MicrosoftJetOLEDB40;" & _

"Data Source=" & strExcelFile & _

";Extended Properties=Excel 80"

strToDBConn = "odbc;Driver={SQL Server};Server=IP地址;Database=数据库名;UID=登录用户;PWD=密码"

'// 以记录集的形式打开 Excel 文件

adoConnOpen strConn

'// 将数据插入到指定的表中

strSQL = "INSERT INTO [" & strToDBConn & "]SQL数据库中的表名 SELECT EXCEL中的字段名(第一行) FROM EXECL工作表名"

adoConnExecute strSQL, , adExecuteNoRecords

'// 这里有可能会产生一个错误,“系统不支持所选择的排序。(-2147467259)”

'// 但实际上已经有执行成功了,所以忽略此错误

If ErrNumber = -2147467259 Then

ErrClear

End If

以上就是关于如何压缩MSSQL数据库日志的大小全部的内容,包括:如何压缩MSSQL数据库日志的大小、请教MS SQL怎么配置、MSSQL的问题`急求帮助等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9488652.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存