存档

文章标签 ‘DBCC’,文章数:5

目标数据库:andkylee,大小:3300M,其中数据段2700M,日志段600M。为其配置dbcc检查使用 dbcc checkstorage 的准备工作

1.根据用户数据库andkylee的情况获取dbccdb的空间大小、工作空间大小、高速缓存大小、工作进程数的建议值

 

sp_plan_dbccdb "andkylee"
go

显示结果如下:

Recommended size for dbccdb database is 94MB (data = 92MB, log = 2MB).
No suitable devices for dbccdb in master..sysdevices.
Recommended values for workspace size, cache size and process count are:
dbname                         scan ws  text ws  cache  comp mem  process count
andkylee                       40576K   10176K   10151K 0K        3
(return status = 0)
由上,建议dbccdb的空间大小至少94M(其中数据段至少92M,日志段至少2M),scan工作空间至少40576K,text工作空间至少10176K,命名高速缓存至少10151K,工作进程数至少3个。

ASE 15.7 新增了命令可以将数据库对象的所有权从一个所有者移交给另一个所有者。

比如将表customer的所有权从dbo移交给bill,使用命令: alter table dbo.customer modify owner bill

不仅仅限于表,还有其它数据库对象包括:视图、存储过程、用户定义函数、默认值、规则、自定义数据类型、加密密钥等;

一次性可以授予多个数据库对象:

1、将 bill 拥有的所有表的所有权都移交给 eric:
    alter table bill.* modify owner eric preserve permissions

2、将 bill 拥有的所有对象的所有权都移交给 eric:
    alter all bill.* modify owner eric preserve permissions

preserve permissions:针对这些对象的所有显式授予或撤消的权限都将被保留,并且权限的 grantor 将更改为新的所有者。-------------------------------------------------------------------------------------------------------------------------------------------------------

以下提供的方法适用于低于ASE 15.7的版本!

SQL Server很相似,Sybase ASE数据库有一些未认证的DBCC命令。日常的维护过程中,需要一些Sybase认证的、公开的DBCC命令来完成,比如:检查数据库或者表的一致性、物理存储分配一致性、重建索引等等。对于这些公开的DBCC命令,Sybase公司是提供技术支持保障的。那些未公开的也就是未认证的DBCC命令,仅限Sybase内部工程师使用;Sybase公司不提供技术支持也不会对于此产生的问题负责。

所以,不要在生产环境上使用未认证的DBCC命令。在测试环境上研究学习使用倒是可以的。

需要记住的是没人对这些未认证的DBCC产后的后果负责。

本篇介绍一个用来关闭或者重启某个用户数据库的未认证DBCC命令:dbcc dbreboot。顺便介绍一个修改对象所有者的方法。因为在ASE中对象的所有权是不能移交的,其它用户只有使用权。这点和中国土地权方面很类似吗?美国人信奉私有制,怎么设计出来这个数据库实现思路?呵呵,有点扯远了~~~

这边的测试环境是ASE15.0.3,我不确定从哪个ASE版本开始支持这个dbcc dbreboot命令的。

首先用isql连接到ASE15.0.3数据库,先打开在屏幕显示输出信息的选项,

dbcc traceon(3604)

go

先来查看一下dbcc dbreboot的用法:

dbcc writepage是sqlserver 2000 和 2005中未公开的命令,也就是说使用这些未官方支持的命令出现的任何后果与MS无关。

同样,本文仅仅演示dbcc writepage的使用,您在操作时出现的任何后果与本人无关。

dbcc writepage的语法为:

   dbcc writepage ({ dbid, ‘dbname’ }, fileid, pageid, offset, length, data)

下面演示dbcc writepage的使用方法:

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

第一步:创建一个测试表

1> create table test (id int not null,name varchar(30) null)
2> go
1> insert into test
2> select 1,'china'
3> go

(1 行受影响)
1> insert into test
2> select 2,'beijing'
3> go

(1 行受影响)

 

1> select object_id('test')
2> go

-----------
 1877581727

(1 行受影响)

表的ID为: 1877581727。


第二步:查看表内数据所在的页面号

1> select * from sysindexes
2> where id = 1877581727
3> go
id          status      first    indid  root     minlen keycnt groupid dpages
   reserved    used        rowcnt               rowmodctr   reserved3 reserved4
xmaxlen maxirow OrigFillFactor StatVersion reserved2   FirstIAM impid  lockflags
 pgmodctr    keys
                                                                name

                                 statblob

                                                    maxlen      rows
----------- ----------- -------- ------ -------- ------ ------ ------- ---------
-- ----------- ----------- -------------------- ----------- --------- ---------
------- ------- -------------- ----------- ----------- -------- ------ ---------
 ----------- -------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------- ----------------
--------------------------------------------------------------------------------
-------------------------------- -----------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------- ----------- -----------
 1877581727           0 0x3B4F00       0 0x000000      8      0       1
 1           2           2                    2           2         0         0
     57       0              0           0           0 0x3C4F00      0         0
           0 NULL
                                                               NULL

                                 NULL

                                                           8000           2

(1 行受影响)


查询属于test表的第一个数据页的页号,在sysindexes表中first列表示对象的第一个物理存储页的页号:0x384F00,也就是页号(1:20283)。

 

第三步:查询修改前的数据内容

下面查询修改前页面(1,20283)上的数据内容。可以看出(1,20283)页上有2行记录,这和插入的2行记录数保持一致。然后,观察到页面的头部有china和beijing的字样,

这和插入的2行记录内容“似乎”一致。


下面我用红色标记了test表中两行测试数据的内容。1,'china'    2,'beijing'

1> dbcc page(9,1,20283,2)
2> go

DATA:
Memory Dump @0x518FC000

518FC000:   01010400 00800001 00000000 00000800 ?................

518FC010:   00000000 00000200 aa000000 721f8a00 ?............r...

518FC020:   3b4f0000 01000000 92010000 75000000 ?;O..........u...

518FC030:   02000000 00000000 00000000 00000000 ?................

518FC040:   01000000 00000000 00000000 00000000 ?................

518FC050:   00000000 00000000 00000000 00000000 ?................

518FC060:   30000800 01000000 0200fc01 00140063 ?0..............c

518FC070:   68696e61 30000800 02000000 0200fc01 ?hina 0...........

518FC080:   00160062 65696a69 6e670000 21212121 ?...beijing ..!!!!

518FC090:   21212121 21212121 21212121 21212121 ?!!!!!!!!!!!!!!!!

518FC0A0:   21212121 21212121 21212121 21212121 ?!!!!!!!!!!!!!!!!

........... 这些是未分配使用的空间

518FDFC0:   21212121 21212121 21212121 21212121 ?!!!!!!!!!!!!!!!!

518FDFD0:   21212121 21212121 21212121 21212121 ?!!!!!!!!!!!!!!!!

518FDFE0:   21212121 21212121 21212121 21212121 ?!!!!!!!!!!!!!!!!

518FDFF0:   21212121 21212121 21212121 74006000 ?!!!!!!!!!!!!t.`.

OFFSET TABLE:

Row - Offset

1 (0x1) - 116 (0x74)

0 (0x0) - 96 (0x60)

DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

 

第四步:修改物理数据页面的内容

通过上面的dbcc page输出结果,仔细数了一下,china这列内容的偏移为111,将china这五个字符改成aaaa。这是最简单的。a的asicc为:97(0x61)。

1> db cc writepage(9,1,20283,111,5,0x6161616161)
2> go
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

 

第五步:查看修改后的物理页面的内容

1> dbcc page(9,1,20283,2)
2> go

DATA:
Memory Dump @0x5002C000

5002C000:   01010400 00820001 00000000 00000800 ?................

5002C010:   00000000 00000200 aa000000 721f8a00 ?............r...

5002C020:   3b4f0000 01000000 92010000 75000000 ?;O..........u...

5002C030:   02000000 00000000 00000000 8234666e ?.............4fn

5002C040:   00000000 00000000 00000000 00000000 ?................

5002C050:   00000000 00000000 00000000 00000000 ?................

5002C060:   30000800 01000000 0200fc01 00140061 ?0..............a

5002C070:   61616161 30000800 02000000 0200fc01 ?aaaa 0...........

5002C080:   00160062 65696a69 6e670000 21212121 ?...beijing ..!!!!

5002C090:   21212121 21212121 21212121 21212121 ?!!!!!!!!!!!!!!!!

5002C0A0:   21212121 21212121 21212121 21212121 ?!!!!!!!!!!!!!!!!

5002C140:   21212121 21212121 21212121 21212121 ?!!!!!!!!!!!!!!!!

5002C150:   21212121 21212121 21212121 21212121 ?!!!!!!!!!!!!!!!!

..................省略未占用空间

5002DFE0:   21212121 21212121 21212121 21212121 ?!!!!!!!!!!!!!!!!

5002DFF0:   21212121 21212121 21212121 74006000 ?!!!!!!!!!!!!t.`.

OFFSET TABLE:

Row - Offset

1 (0x1) - 116 (0x74)

0 (0x0) - 96 (0x60)

DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。

 

第六步:通过客户端工具验证修改后的数据内容

1> select * from test
2> go
id          name
----------- ------------------------------
          1 aaaaa
          2 beijing

(2 行受影响)
可以看到第一行记录的name列由china改为了aaaaa

备注: 以上演示的是仅仅修改某一行某一列的数据,并且修改后的内容和修改前的内容保持长度一致。

如果修改多列或者修改前后的字段长度不一致;进一步修改整行数据,或者修改整页的数据的话,可能会复杂许多。

————————————————————————————————-
—- 本文为andkylee个人原创,请在尊重作者劳动成果的前提下进行转载;
—- 转载务必注明原始出处 : http://www.dbainfo.net
—- 关键字:dbcc writepage undocumented command 修改 物理页面 page
————————————————————————————————-

这是一篇受密码保护的文章。您需要提供访问密码:


SQL SERVER DBCC命令解释
------------------------------------------
--1 dbcc trraceon DBCC TRACEOFF
--对于数据库死锁,通常可以通过TRACE FLAG 1204、1205、1206,检查ERRORLOG里面的输出,和分析SQLTRACE的执行上下文判断死锁问题的来由。
--TRACEON函数的第三个参数设置为-1,表示不单单针对当前connection,
--而是针对所有包括未来建立的connection。这样,才够完全,否则只是监视当前已经建立的数据库连接了。
--执行下面的话可以把死锁记录到Errorlog中:
dbcc traceon (1204, 3605, -1)
go
dbcc tracestatus(-1)
go

--说明:
--260:打印关于扩展存储过程动态链接库的版本信息
--444:停止auto-parameterization
--1200:输出锁信息
--1204:传回参与死锁的SQL SERVER相关程序之运行数据
--1211:停止lock escalation(锁升级)
--1252:显示动态选择锁的相关信息
--2528:通过 DBCC CHECKDB、DBCC CHECKFILEGROUP 和 DBCC CHECKTABLE 禁用对象的并行检查。
--默认情况下,并行度由查询处理器自动确定。最大并行度的配置方式与并行查询相同。
--有关更多信息,请参见 max degree of parallelism 选项。
-- 通常情况下,应将并行 DBCC 保留为启用状态。执行 DBCC CHECKDB 时,
-- 查询处理器重新评估和自动调整并行度,并检查每个表或一批表。
--有时,检查可能在服务器处于实际空闲状态时进行。如果管理员知道在检查结束前负荷将加大,
--可能希望手工减小或禁用并行度。
-- 但是,禁用并行检查会导致数据库的总体性能降低。降低并行度将增加必须扫描的事务日志量。
--这反过来增加了对 tempdb 空间的需求,并导致 dbcc 完成检查所需的时间非线性增加。
--如果运行 DBCC 时启用了 TABLOCK 功能并关闭了并行度,则表可能被锁定更长时间。
--3205:默认情况下,如果磁带驱动器支持硬件压缩,则 DUMP 或 BACKUP 语句会使用该功能。
-- 利用此跟踪标记,可以禁用磁带驱动程序的硬件压缩。
-- 本项在要与不支持压缩的其它站点或磁带驱动器交换磁带时有用。
--3604:将trace结果输出到前端
--3605:要求DBCC的输出放到SQL server ERROR LOG
--8602:停止索引提示功能
--8722:停止join group等最优化提示功能
--8755:停止锁提示功能
--8780:停止最优化超时配置,强制做完整的最优化动作
------------------------------------------------------
--2 DBCC page
dbcc traceon(3604)
dbcc page(northwind,1,100,1)
/*查询northwind 的数据的第101个页面的信息*/
/*DBCC Page ({dbid|dbname},filenum,pagenum[,printopt])
?
具体参数描述如下:
dbid: 包含页面的数据库ID
dbname:包含页面的数据库的名称
filenum:包含页面的文件编号
pagenum:文件内的页面
printopt:可选的输出选项;选用其中一个值:
0:默认值,输出缓冲区的标题和页面标题
1:输出缓冲区的标题、页面标题(分别输出每一行),以及行偏移量表
2:输出缓冲区的标题、页面标题(整体输出页面),以及行偏移量表
3:输出缓冲区的标题、页面标题(分别输出每一行),以及行偏移量表;每一行后跟分别列出的它的列值
*/
------------------------------------------------------
--3 DBCC checkalloc
DBCC checkalloc(northwind)
/*检查指定数据库的系统表内和表间的一致性
checkalloc是检查指定数据库,看其所有正确分配的页和尚未分配的页的情况。
若未指定数据库名,则checkalloc检查当前数据库。checkalloc会返回已分配的和使用的空间数量。
checkalloc的缺省模式为nofix,要使用fix选项,必须把数据库置于单用户模式。
*/
-----------------------------------------------------
--4 DBCC checkcatalog
DBCC checkcatalog(northwind)
/*
检查批定数据库的系统表内和系统表间的一致性
*/
-----------------------------------------------------
--5 DBCC checkconstraints
DBCC checkconstraints(products)
/*
检查指定表上的指定约束或所有约束的完整性
DBCC CHECKCONSTRAINTS
[('table_name'|'constraint_name'
)]
[WITH {ALL_ERRORMSGS|ALL_CONSTRAINTS}]
DBCC CHECKCONSTRAINTS在某个数据库中,检测某些特定的约束或者全部约束的一致性。
DBCC CHECKCONSTRAINTS总是在当前数据库的上下文环境中执行。
  注意,DBCC CHECKCONSTRAINTS并不进行磁盘或者文件级别的一致性检测;
它只是确保外键定义的一致性,同时检测约束——仅仅是确认数据有效。
如果你希望检测磁盘上表和索引的一致性,
你应该执行DBCC CHECKDB或者在所有的表上执行DBCC CHECKALLOC和 DBCC CHECKTABLE的组合。
*/
------------------------------------------------------
--6 DBCC checkdb
DBCC checkdb
/*
检查数据库中的所有对象的分配和结构完整性
checkdb [('database_name'[, NOINDEX | REPAIR])]
[WITH NO_INFOMSGS[, ALL_ERRORMSGS][, PHYSICAL_ONLY]
[, ESTIMATEONLY][, TABLOCK]]
*/
-----------------------------------------------------
--7 DBCC cleantable
DBCC cleantable
/*
回收alter table drop column语句 删除可变长度列或text列后的存储空间
cleantable ('database_name'|database_id, 'table_name'|table_id, [batch_size])
*/
-----------------------------------------------------
--8 DBCC dbreindex
DBCC dbreindex
/*
重建指定数据库的一个或多个索引
dbreindex ('table_name' [, index_name [, fillfactor ]]) [WITH NO_INFOMSGS]
*/
-----------------------------------------------------
--9 DBCC indexdefrag
DBCC indexdefrag
/*
对表或视图上的索引和非聚集索引进行碎片整理
indexdefrag ({dbid | dbname | 0}, {tableid | tablename}, {indid | indname})
*/