??xml version="1.0" encoding="utf-8" standalone="yes"?>激情小说亚洲图片,亚洲国产高清精品线久久,亚洲AV日韩AV永久无码久久http://www.tkk7.com/xine/category/11742.html&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I love you not because of who you are,but because of who I am when I am with you.<br><br>zh-cnFri, 02 Mar 2007 06:43:35 GMTFri, 02 Mar 2007 06:43:35 GMT60SQL Server建立跨服务器的视?/title><link>http://www.tkk7.com/xine/articles/50757.html</link><dc:creator>【Xine】中文站</dc:creator><author>【Xine】中文站</author><pubDate>Tue, 06 Jun 2006 05:37:00 GMT</pubDate><guid>http://www.tkk7.com/xine/articles/50757.html</guid><wfw:comment>http://www.tkk7.com/xine/comments/50757.html</wfw:comment><comments>http://www.tkk7.com/xine/articles/50757.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/xine/comments/commentRss/50757.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/xine/services/trackbacks/50757.html</trackback:ping><description><![CDATA[--首先建立链接服务?br />EXEC sp_addlinkedserver <br /> (tng) (tng) 'instance1', <br /> (tng) (tng) '', <br /> (tng) (tng) 'MSDASQL',<br /> (tng) (tng) NULL,<br /> (tng) (tng) NULL,<br /> (tng) (tng) 'DRIVER={SQL Server};SERVER=192.168.1.100;UID=sa;PWD=123;'<br />GO<br /><br />--查看链接服务?br />EXEC sp_linkedservers<br /><br />--删除链接服务?br />EXEC sp_dropserver 'instance1'<br /><br />--开始查询测?br />select * from instance1.db1.dbo.table1<br />select * from 别名.数据库名.dbo.表名<br /><br /><br />ldelphiq接试Q发C个数据源q不能连接到链接服务器的?br />l尝试以下方法可以用delphiq接视图Q?br />create view educational1 as<br />SELECT (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) *<br />FROM (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) OPENDATASOURCE ('SQLOLEDB', <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 'Data Source=192.168.1.100; <br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) USER ID = sa ;Password=123 '<br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) ).shbbs.dbo.educational Rowset_1<img src ="http://www.tkk7.com/xine/aggbug/50757.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/xine/" target="_blank">【Xine】中文站</a> 2006-06-06 13:37 <a href="http://www.tkk7.com/xine/articles/50757.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>修复SQL Server 2000数据库之实战l验http://www.tkk7.com/xine/articles/49692.html【Xine】中文站【Xine】中文站Thu, 01 Jun 2006 08:49:00 GMThttp://www.tkk7.com/xine/articles/49692.htmlhttp://www.tkk7.com/xine/comments/49692.htmlhttp://www.tkk7.com/xine/articles/49692.html#Feedback0http://www.tkk7.com/xine/comments/commentRss/49692.htmlhttp://www.tkk7.com/xine/services/trackbacks/49692.html  因ؓ(f)数据比较的重要,q且数据定w也不大,我们要求的备份策略是每天在磁带机做POS_DB的全备䆾Q一个星?天一个@环)(j)Q在晚上q在盘?sh)做全部备䆾QMASTER,MSDB,POS_DB).q样保持双重的保险?

1.故障爆发Q?/strong>
2003Q?2Q?6 13:00
客户报告所有的POSL和SERVERq行速度非常的慢。经q重新启动服务器Q启动到(g)查RAID卡时开始报警)(j)我们发现在WINDEOWS 2000 SERVER的“系l日志”中有这L(fng)信息Q?br />Error: 823, Severity: 24, State: 2
I/O error (torn page) detected during read at offset 0x0000001bf96000 in file D :\DATA\POS_DB.mdf'.
SQLSERVER的“错误日志”中有这L(fng)信息Q?
2003-12-10 03:34:22.23 spid56 Error: 823, Severity: 24, State: 2
2003-12-10 03:34:22.23 spid56 I/O error (torn page) detected during read at offset 0x00000074964000 in file 'D:\DATA\POS_DB.mdf'
..
来自msdn的解释:(x)
  I/O logical check failure: If a read Windows API call or a write Windows API call for a database file is successful, but specific logical checks on the data are not successful (a torn page, for example), an 823 error is raised. The following error message is an example of an 823 error for an I/O logical check failure:
2003-09-05 16:51:18.90 spid17 Error: 823, Severity: 24, State: 2
2003-09-05 16:51:18.90 spid17 I/O error (torn page) detected during read at offset 0x00000094004000 in file 'F:\SQLData\mydb.MDF'..

  To resolve this problem, first run the DBCC CHECKDB statement on the database that is associated with the file in the error message. If the DBCC CHECKDB statement reports errors, correct those errors before you troubleshoot this problem. If the problem persists even after the DBCC CHECKDB errors have been corrected, or if the DBCC CHECKDB statement does not report any errors, review the Microsoft Windows NT system event log for any system errors or disk-related errors. You can also contact your hardware vendor to run any appropriate diagnostics.
   I/O逻辑(g)查失败:(x)如果有一个WINDOWSE序在读取和写数据库文g时是成功的,但是在详l的数据逻辑(g)查时没有成功Q比如:(x)不完整的)(j)QSQLSERVER?x)返回MSG 823的错误。下面就是一个I/O逻辑(g)查失败MSG 823的实例:(x)
2003-09-05 16:51:18.90 spid17 Error: 823, Severity: 24, State: 2
2003-09-05 16:51:18.90 spid17 I/O error (torn page) detected during read at offset 0x00000094004000 in file 'F:\SQLData\mydb.MDF'..
  要解册L(fng)问题Q首先要在该数据库中执行DBCC CHECKDBQ错误信息提C的数据库文Ӟ(j)。如果DBCC CHECKDB报错Q在你修复错误之前纠正这些错误。如果这些错误信息一直保留到执行DBCC CHECKDBq行之后Q或者DBCC CHECKDB没有报告M错误Q检查WINDOWS NTpȝ的的事g查看器的和系l错误或盘错误相关的信息。你也可以联pȝ件厂商运行正的诊断工具?/p>


  坏了(jin):-(Q数据库文g有问题,在检查OS的事件查看器Q我们发现在一个星期之前就有错误信息(只是OFFSET的偏Ud址不同Q?/p>

  赶紧(g)查HDD,果然发现在RAID5的第一快HDD亮了(jin)U灯Q灰太多,很难于看清)(j)

执行 DBCC CHECKDB('POS_DB')(g)查发玎ͼ(x)
Server: Msg 8909, Level 16, State 1, Line 1
Table error: Object ID 26342838, index ID 35207, page ID (1:50978). The PageId in the page header =(32230:-2048732002).


Server: Msg 8939, Level 16, State 1, Line 1
Table error: Object ID 859150106, index ID 255, page (1:238770). Test (IS_ON (BUF_IOERR, bp->bstat) && bp->berrcode) failed. Values are 2057 and -1.


Server: Msg 8928, Level 16, State 1, Line 1
Object ID 861246123, index ID 0: Page (1:57291) could not be processed. See other errors for details.


Server: Msg 2511, Level 16, State 1, Line 1
Table error: Object ID 862626116, Index ID 0. Keys out of order on page (1:269310), slots 0 and 1.

啊哈Q果然有很多的表都有错误兌Q请记录每一个错误表的OBJECT ID)
从MSDN查到Q?br />错误号Msg 823:表示SQLSERVER在读取数据和写数据时(g)到g讑֤有问题或者系l有问题?br />TORN PAGE:的意思是不完整的?br />0x0000001bf96000Q这是从数据文g开始处到TORN PAGE 的字节数?br />错误号Msg 8939 Q大家可以看看:(x)http://support.microsoft.com/default.aspx?kbid=320434
FIXQ在q行 CHECKDB Ӟh TABLOCK 提示的大定w插入Qbulk insert, bcp {)(j)可能D错误 8929 ?8965
错误号MSG 8928:是和8939相关联的信息Q?br />错误号MSG 8965:是和8939相关联的信息Q?p>大家可以C面的地址扑ֈ相关的信息:(x)
http://support.microsoft.com/default.aspx?scid=kb;en-us;826433
PRB: Additional SQL Server Diagnostics Added to Detect Unreported I/O Problems
http://support.microsoft.com/default.aspx?scid=kb;en-us;828339
PRB: Error message 823 may indicate hardware problems or system problems
http://support.microsoft.com/default.aspx?scid=kb;en-us;308795
FIX: CheckDB May Not Fix Error 8909 or Error 8905

故障诊QRAID有一块HDD坏,造成数据库文件破?/p>

2.更换HDD
2003Q?2Q?8 23:00
现在׃C(jin)RAID5的好处,坏了(jin)一块HDDQ系l可以照常运行,不过pȝ的日志和SQLSERVER的日志还是有MSG823的报错信息?br />按照RAID 卡的REBUILD的步骤将新的HDDl定到原始的RAID5中,利完成:-)
用DBCC(g)查数据库的完整?br />DBCC CHECKDB('POS_DB') WITH ALL_ERRORMSGS
发现q是有和更换HDD之前一L(fng)ERROR信息Q看来数据库文gq是有问题?/p>

--有一个奇怪问?Q既然是5块HDD的RAID5Qؓ(f)何有一块HDD坏会(x)影响数据库文件的损坏Q不解?Q?:-(

3.恢复数据?br />2003Q?2Q?9 00:30
没有办法Q用备䆾的数据集恢复数据库(看来备䆾是多么的重要Q?br />USE MASTER
GO
RESTORE DATABASE POS_DB FROM DISK='D:\DATABASEBACKUP\POS_DB_BACKUP.DAT'
重新启动MSSQLSERCVER服务Q?br />NET STOP MSSQLSERVER / NET START MSSQLSERVER
用DBCC(g)查数据库的完整?br />DBCC CHECKDB('POS_DB') WITH ALL_ERRORMSGS

和恢复之前的错误信息一_(d)没有改变?br />--奇怪问题(sh)2QSQLSERVER BACKUP 之前q不验证数据库的完整性,数据库的全备份竟然是有问题的。气愤!Q?/p>

看来只能通过工具修复数据库了(jin)Q?-在修改之前记录错误表的记录数Q以便修复数据库后进行比较)(j)?br />在查询分析器中运行:(x)
ALTER DATABASE POS_DB SET SINGL_USER
GO
DBCC CHECKDB('POS_DB',repair_allow_data_loss) WITH TABLOCK
GO
ALTER DATABASE POS_DB SET MULTI_USER
GO

CHECKDB ?个参?
REPAIR_ALLOW_DATA_LOSS
执行?REPAIR_REBUILD 完成的所有修复,包括对行和页q行分配和取消分配以Ҏ(gu)分配错误、结构行或页的错误,以及(qing)删除已损坏的文本对象。这些修复可能会(x)D一些数据丢失。修复操作可以在用户事务下完成以允许用户回滚所做的更改。如果回滚修复,则数据库仍会(x)含有错误Q应该从备䆾q行恢复。如果由于所提供修复{的缘故遗漏某个错误的修复Q则遗漏Q何取决于该修复的修复。修复完成后Q备份数据库?
REPAIR_FAST q行的、不耗时的修复操作,如修复非聚集索引中的附加键。这些修复可以很快完成,q且不会(x)有丢失数据的危险?
REPAIR_REBUILD 执行?REPAIR_FAST 完成的所有修复,包括需要较长时间的修复Q如重徏索引Q。执行这些修复时不会(x)有丢失数据的危险?

W一ơ运行,我们?x)发玎ͼ?x)
DBCC results for 'TABLE_NAME'.
There are 1 rows in 1 pages for object 'TABLE_NAME'.
The error has been repaired.
CHECKDB found 0 allocation errors and 1 consistency errors in table '(Object ID 26342838)' (object ID 26342838).
CHECKDB fixed 0 allocation errors and 1 consistency errors in table '(Object ID 26342838)' (object ID 26342838).
q样的信息有很多Qƈ且有“The error has been repaired”的提示。不q到最后还是有q样的信息:(x)
CHECKDB found 0 allocation errors and 19 consistency errors in database 'POS_DB'.
CHECKDB fixed 0 allocation errors and 19 consistency errors in database 'POS_DB'.
再次q行Q还是有同样的错误。糟p?=)看来q种方式是无法修复这h错误?/p>

p|Q!Q?/p>

再仔l看看SQLSERVER BOL发现CHECKDBq有一个非常有用的参数PHYSICAL_ONLY

PHYSICAL_ONLY
仅限于检查页和记录标题物理结构的完整性,以及(qing)对?ID 和烦(ch)?ID 与分配结构之间的一致性。该(g)查旨在以较低的开销(g)查数据库的物理一致性,同时q检会(x)危及(qing)用户数据安全的残~页和常见的g故障。PHYSICAL_ONLY 始终意味着 NO_INFOMSGSQƈ且不能与M修复选项一起用?/p>


再次q行Q?br />DBCC CHECKDB('POS_DB') with NO_INFOMSGS,PHYSICAL_ONLY
然后再运行:(x)
DBCC CHECKDB('POS_DB',repair_allow_data_loss) WITH TABLOCK
q次?x)返回一?952.8956的错误信?
Server: Msg 8952, Level 16, State 1, Line 1
Table error: Database 'POS_DB', index 'POS_REFER.Idx2_POS_REFER' (ID 861246123) (index ID 2). Extra or invalid key for the keys:


Server: Msg 8956, Level 16, State 1, Line 1
Index row (1:26315:23) with values (PLU_ID = '6922825200240' and PRD_AGGR_ID = 10006 and EVNT_ID = NULL and RGST_MDE = 0 and SUBPRD_NBR = 0 and STR_ID = 12 and PRD_AGGR_ID = 10006 and SUBPRD_NBR = 0 and STR_ID = 12 and PLU_ID = '6922825200240' and EVNT_ID = NULL and RGST_MDE = 0) points to the data row identified by ().

Ҏ(gu)MSDN上的说明Q?br />This problem does not cause any data or index corruption. The problem is in the metadata which is corrected only by dropping and re-creating the indexes.
q些问题?sh)?x)引v数据或烦(ch)引的损坏Q这些问题的元数据是正确的,只是删除再重新徏立烦(ch)引?br />看来问题是修改了(jin)?/p>


再次q行DBCC CHECKDB('POS_DB'),再次q行:DBCC CHECKDB('POS_DB'),message没有错误信息?/p>

ok成功修复:-)


4.(g)查修复后的数据库q且备䆾数据?/strong>
(g)查DBCC CHECKDB报错的相兌Q和没有执行DBCC之前的记录数q行比较Q发现有一个表了(jin)40条记录。郁?-

5.ȝ

1.RAID5q不能保证SQLSERVER 2000 数据库的数据文g的完整性;
2.SQLERVER 2000的备份程序不验证数据库文件的数据完整性;如果你的数据文g有问题,备䆾时也不图C;
3.DBCC CHECKDB的repair_allow_data_lossq不是非常安全的Q不能修复所有的错误Q即使是对不完整(TORN PAGEQ的修复也会(x)着成数据丢失;
4.DBCC CHECKDB的REPAIR_ALLOW_DATA_LOSS参数无法修复所有的错误;

参考文?
http://support.microsoft.com/default.aspx?scid=kb;en-us;298806
http://support.microsoft.com/default.aspx?scid=kb;en-us;284440
http://support.microsoft.com/default.aspx?kbid=320434
http://support.microsoft.com/default.aspx?scid=kb;en-us;828339
http://support.microsoft.com/default.aspx?scid=kb;en-us;308795
http://support.microsoft.com/default.aspx?scid=kb;en-us;826433

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

EXECUTE master.dbo.xp_sqlmaint N'-PlanID 4F597334-7ABF-4140-8DF3-2CE11E9CE6C2 -Rpt "E:\DATABASE\数据库维护计?4.txt" (tng) -BkUpMedia DISK -BkUpDB "E:\DATABASE" -BkExt "BAK"'

数据库全备䆾也成功了(jin)


Microsoft (R) SQLMaint 实用工具QUnicodeQ,版本 d?SQL Server“P4”以“NT AUTHORITY\SYSTEM”(受信任)(j)w䆾
开始维护计划“数据库l护计划1”(?2005-7-6 15:56:31 上)(j)
[1] 数据?OTSP?备䆾...
 (tng) (tng) (tng) 目的: [E:\DATABASE\OtSpOnline_db_200507061556.BAK]

 (tng) (tng) (tng) ** 执行旉: 0 时Q? 分钟Q?0 U?**

l束l护计划“数据库l护计划1”(?2005-7-6 15:59:01 上)(j)
SQLMAINT.EXE q程退Z? 0 (成功)


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

执行下面的数据库l护计划

EXECUTE master.dbo.xp_sqlmaint N'-PlanID DB9949C7-4262-46EF-A16E-B5A16E9455CC -Rpt "E:\db_bak\数据库维护计?Tonychen-200507022.txt" -DelTxtRpt 1WEEKS -WriteHistory (tng) -CkDBRepair (tng) '

错误日志如下Q?/font>
Microsoft (R) SQLMaint 实用工具QUnicodeQ,版本 d?SQL Server“SPSERVER”以“SPSERVER\Administrator”(受信任)(j)w䆾
开始维护计划“数据库l护计划-Tonychen-20050702”(?2005-7-6 11:32:32 上)(j)
[1] 数据?OtSp: (g)查数据链?..
[Microsoft SQL-DMO QODBC SQLState: 42000Q] 错误 8906: [Microsoft][ODBC SQL Server Driver][SQL Server]扩展盘区 (3:10487)Q属于数据库 ID 7Q在 SGAM (3:3) ?PFS (3:8088) 中进行了(jin)分配Q但未在M IAM 中进行过分配。PFS 标志 'MIXED_EXT ALLOCATED (tng) (tng) 0_PCT_FULL'?br />[Microsoft][ODBC SQL Server Driver][SQL Server]CHECKDB 发现?1 个分配错误和 0 个一致性错误(在表 'WWCHAT_SUB_Around' 中,该表的对?ID ?1214627370Q?br />[Microsoft][ODBC SQL Server Driver][SQL Server]CHECKDB 发现?1 个分配错误和 0 个一致性错误(在数据库 'OtSp' 中)(j)?br />[Microsoft][ODBC SQL Server Driver][SQL Server]repair_allow_data_loss 是最低的修复U别Q对于由 DBCC CHECKDB (OtSp noindex) 发现的错误而言Q?/p>

 (tng) (tng) (tng) 发现下列错误:

[Microsoft][ODBC SQL Server Driver][SQL Server]扩展盘区 (3:10487)Q属于数据库 ID 7Q在 SGAM (3:3) ?PFS (3:8088) 中进行了(jin)分配Q但未在M IAM 中进行过分配。PFS 标志 'MIXED_EXT ALLOCATED (tng) (tng) 0_PCT_FULL'?br />[Microsoft][ODBC SQL Server Driver][SQL Server]CHECKDB 发现?1 个分配错误和 0 个一致性错误(在表 'WWCHAT_SUB_Around' 中,该表的对?ID ?1214627370Q?br />[Microsoft][ODBC SQL Server Driver][SQL Server]CHECKDB 发现?1 个分配错误和 0 个一致性错误(在数据库 'OtSp' 中)(j)?br />[Microsoft][ODBC SQL Server Driver][SQL Server]repair_allow_data_loss 是最低的修复U别Q对于由 DBCC CHECKDB (OtSp noindex) 发现的错误而言Q?br /> (tng) (tng) (tng) ** 执行旉: 0 时Q? 分钟Q?1 U?**

[2] 数据?otspbak: (g)查数据链?..

 (tng) (tng) (tng) ** 执行旉: 0 时Q? 分钟Q? U?**

正在删除旧的文本报告... (tng) (tng) 已删?0 个文件?/p>

l束l护计划“数据库l护计划-Tonychen-20050702”(?2005-7-6 11:33:17 上)(j)
SQLMAINT.EXE q程退Z? 1 (p|)

解决Ҏ(gu)Q?/font>
alter database otsponline set single_user --切换到单用户模式?br />dbcc checkdb('otsp',repair_allow_data_loss) WITH TABLOCK -- q行数据库修?br />alter database otsponline set multi_user --切换回到多用h式下


重新执行数据库维护计划:(x)
EXECUTE master.dbo.xp_sqlmaint N'-PlanID DB9949C7-4262-46EF-A16E-B5A16E9455CC -Rpt "E:\db_bak\数据库维护计?Tonychen-200507022.txt" -DelTxtRpt 1WEEKS -WriteHistory (tng) -CkDBRepair (tng) '


事务日志正确Q?/font>

Microsoft (R) SQLMaint 实用工具QUnicodeQ,版本 d?SQL Server“P4”以“NT AUTHORITY\SYSTEM”(受信任)(j)w䆾
开始维护计划“数据库l护计划1”(?2005-7-6 15:53:49 上)(j)
[1] 数据?OTSP: (g)查数据链?..

 (tng) (tng) (tng) ** 执行旉: 0 时Q? 分钟Q?4 U?**

l束l护计划“数据库l护计划1”(?2005-7-6 15:55:23 上)(j)
SQLMAINT.EXE q程退Z? 0 (成功)



]]>
SQL Server技?/title><link>http://www.tkk7.com/xine/articles/49682.html</link><dc:creator>【Xine】中文站</dc:creator><author>【Xine】中文站</author><pubDate>Thu, 01 Jun 2006 08:41:00 GMT</pubDate><guid>http://www.tkk7.com/xine/articles/49682.html</guid><wfw:comment>http://www.tkk7.com/xine/comments/49682.html</wfw:comment><comments>http://www.tkk7.com/xine/articles/49682.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/xine/comments/commentRss/49682.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/xine/services/trackbacks/49682.html</trackback:ping><description><![CDATA[1.把某个字D重新生气序??到n):<br />DECLARE (tng)@i (tng)int<br />Set (tng)@i (tng)= (tng)0<br />Update (tng)Table1 (tng)Set (tng)@i (tng)= (tng)@i (tng)+ (tng)1,Field1 (tng)= (tng)@i<br /><br />2.按成l排名次<br />Update (tng)成W?br />Set (tng)a.名次 (tng)= (tng)(<br />Select (tng)Count(*) (tng)+ (tng)1<br />From (tng)成W表?tng)b<br />Where (tng)a.Ll?lt; (tng)b.Ll?br />)<br />From (tng)成W表?tng)a<br /><br />3.查询外部数据?br />Select (tng)a.*<br />From (tng)OpenRowSet('Microsoft.Jet.OLEDB.4.0','c:\test.mdb';'admin';',Table1) (tng)a<br /><br />4.查询Excel文g<br />Select (tng)* (tng)<br />From (tng)OpenDataSource('Microsoft.Jet.OLEDB.4.0','Data (tng)Source="c:\test.xls";User (tng)I(yng)D=Admin;Password=;Extended (tng)properties=Excel (tng)8.0')...Sheet1Q?br /><br />5.在查询中指定排序规则<br />Select (tng)* (tng)From (tng)Table1 (tng)Order (tng)By (tng)Field1 (tng)COLLATE (tng)Chinese_PRC_BIN<br />Z么要指定排序规则?参见:<br /><img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.blogcn.com/images/aurl.gif" onload="javascript:if(this.width>500)this.style.width=500;" align="absBottom" border="0" /><a target="_blank"><font color="#002c99">http://www.delphibbs.com/delphibbs/dispq.asp?lid=1633985</font></a><br />?(g)查数据库中的Pub_Users表中是否存在指定的用?<br />Select (tng)Count(*) (tng)From (tng)Pub_Users (tng)Where (tng)[UserName]='admin' (tng)And (tng)[PassWord]='aaa' (tng)COLLATE (tng)Chinese_PRC_BIN<br />默认比较是不区分大小写的,如果不加COLLATE (tng)Chinese_PRC_BIN,那么密码aaa与AAA是等效的,q当然与实际不符.注意的是,每个条g都要指定排序规则,上例中用户名׃区分大小?<br /><br /><br />6.Order (tng)By的一个小技?br />Order (tng)By可以指定列序而不用指定列?在下面的例子里说明它的用?注意,W三列未指定别名)<br />Select (tng)a.ID,a.Name,(Select (tng)Count(*) (tng)From (tng)TableB (tng)b (tng)Where (tng)a.ID=b.PID) (tng)From (tng)TableA (tng)a (tng)Order (tng)By (tng)3<br /><br /><font class="diary_poster"><!--子菜单开?-><div class="qkjbkhk" id="blog_sub_st"> (tng)</div></font><img src ="http://www.tkk7.com/xine/aggbug/49682.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/xine/" target="_blank">【Xine】中文站</a> 2006-06-01 16:41 <a href="http://www.tkk7.com/xine/articles/49682.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL Server 分页q程http://www.tkk7.com/xine/articles/49681.html【Xine】中文站【Xine】中文站Thu, 01 Jun 2006 08:40:00 GMThttp://www.tkk7.com/xine/articles/49681.htmlhttp://www.tkk7.com/xine/comments/49681.htmlhttp://www.tkk7.com/xine/articles/49681.html#Feedback0http://www.tkk7.com/xine/comments/commentRss/49681.htmlhttp://www.tkk7.com/xine/services/trackbacks/49681.html

-----------------------------------------------------
-- Export file for user SA (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) --
-- Created by Administrator on 2005-1-30, 18:05:12 --
-----------------------------------------------------

spool asdsd.log

prompt
prompt Creating table TEST
prompt ===================
prompt
create table TEST
(
 (tng) NAME (tng) (tng) VARCHAR2(20),
 (tng) PASSWD VARCHAR2(20)
)
tablespace USERS
 (tng) pctfree 10
 (tng) initrans 1
 (tng) maxtrans 255
 (tng) storage
 (tng) (
 (tng) (tng) (tng) initial 64K
 (tng) (tng) (tng) minextents 1
 (tng) (tng) (tng) maxextents unlimited
 (tng) );

prompt
prompt Creating package DOTNET
prompt =======================
prompt
create or replace package DotNet as

 (tng) TYPE type_cur IS REF CURSOR; (tng) (tng) (tng) (tng) --定义游标变量用于q回记录?/p>

 (tng) PROCEDURE DotNetPagination(
 (tng) Pindex in varchar2, (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) --分页索引
 (tng) Psize in varchar2, (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) --面大小
 (tng) Psql in varchar2, (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) --产生dataset的sql语句
 (tng) Pcount out number, (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) --q回分页L
 (tng) v_cur out type_cur (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) --q回当前|据记?br /> (tng) );
 (tng)
 (tng) PROCEDURE DotNetPageRecordsCount(
 (tng) Psqlcount in varchar2,
 (tng) Prcount (tng) (tng) out number
 (tng) );
 (tng)
end DotNet;
/

prompt
prompt Creating package PKG_TEST
prompt =========================
prompt
CREATE OR REPLACE PACKAGE pkg_test
AS
 (tng) (tng) TYPE myrctype IS REF CURSOR;

 (tng) (tng) PROCEDURE get (p_id in NUMBER, p_rc OUT myrctype);
END pkg_test;
/

prompt
prompt Creating package PKG_TEST_FUNCTION
prompt ==================================
prompt
create or replace package pkg_test_function as
/* 定义ref cursorcd
 (tng) (tng) (tng) 不加returncdQؓ(f)q型,允许动态sql查询Q?
 (tng) (tng) (tng) 否则为强cdQ无法用动态sql查询;
*/
 (tng) (tng) type myrctype is ref cursor; (tng)
 (tng) (tng)
--函数x(chng)
 (tng) (tng) function get(intID number) return myrctype;
end pkg_test_function;
/

prompt
prompt Creating procedure DOTNETPAGINATION
prompt ===================================
prompt
CREATE OR REPLACE PROCEDURE dotnetpagination (
 (tng) (tng) (tng) (tng) (tng) pindex (tng) (tng) IN (tng) (tng) (tng) (tng) (tng) (tng) number,
 (tng) (tng) (tng) (tng) (tng) psize (tng) (tng) (tng) IN (tng) (tng) (tng) (tng) (tng) (tng) number,
 (tng) (tng) (tng) (tng) (tng) psql (tng) (tng) (tng) (tng) IN (tng) (tng) (tng) (tng) (tng) (tng) VARCHAR2,
 (tng) (tng) (tng) (tng) (tng) pcount (tng) (tng) OUT (tng) (tng) (tng) (tng) (tng) NUMBER
 (tng) (tng) )
 (tng) (tng) IS
 (tng) (tng) (tng) (tng) (tng) v_sql (tng) (tng) (tng) (tng) VARCHAR2 (1000);
 (tng) (tng) (tng) (tng) (tng) v_count (tng) (tng) NUMBER;
 (tng) (tng) (tng) (tng) (tng) v_plow (tng) (tng) (tng) NUMBER;
 (tng) (tng) (tng) (tng) (tng) v_phei (tng) (tng) (tng) NUMBER;
 (tng) (tng) BEGIN
------------------------------------------------------------取分|L
 (tng) (tng) (tng) (tng) (tng) v_sql := 'select count(*) from (' || psql || ')';

 (tng) (tng) (tng) (tng) (tng) EXECUTE IMMEDIATE v_sql
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) INTO v_count;
 (tng) (tng) (tng) (tng) (tng) pcount := CEIL (v_count / psize);
------------------------------------------------------------昄L内?br /> (tng) (tng) (tng) (tng) (tng) v_phei := pindex * psize + psize;
 (tng) (tng) (tng) (tng) (tng) v_plow := v_phei - psize + 1;

 (tng) (tng) END dotnetpagination;
/

prompt
prompt Creating package body DOTNET
prompt ============================
prompt
CREATE OR REPLACE PACKAGE BODY dotnet
AS
--***************************************************************************************
 (tng) (tng) PROCEDURE dotnetpagination (
 (tng) (tng) (tng) (tng) (tng) pindex (tng) (tng) IN (tng) (tng) (tng) (tng) (tng) (tng) VARCHAR2,
 (tng) (tng) (tng) (tng) (tng) psize (tng) (tng) (tng) IN (tng) (tng) (tng) (tng) (tng) (tng) VARCHAR2,
 (tng) (tng) (tng) (tng) (tng) psql (tng) (tng) (tng) (tng) IN (tng) (tng) (tng) (tng) (tng) (tng) VARCHAR2,
 (tng) (tng) (tng) (tng) (tng) pcount (tng) (tng) OUT (tng) (tng) (tng) (tng) (tng) NUMBER,
 (tng) (tng) (tng) (tng) (tng) v_cur (tng) (tng) (tng) OUT (tng) (tng) (tng) (tng) (tng) type_cur
 (tng) (tng) )
 (tng) (tng) IS
 (tng) (tng) (tng) (tng) (tng) v_sql (tng) (tng) (tng) (tng) VARCHAR2 (1000);
 (tng) (tng) (tng) (tng) (tng) v_count (tng) (tng) NUMBER;
 (tng) (tng) (tng) (tng) (tng) v_plow (tng) (tng) (tng) NUMBER;
 (tng) (tng) (tng) (tng) (tng) v_phei (tng) (tng) (tng) NUMBER;
 (tng) (tng) BEGIN
------------------------------------------------------------取分|L
 (tng) (tng) (tng) (tng) (tng) v_sql := 'select count(*) from (' || psql || ')';

 (tng) (tng) (tng) (tng) (tng) EXECUTE IMMEDIATE v_sql
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) INTO v_count;
 (tng) (tng) (tng) (tng) (tng) pcount := CEIL (v_count / psize);
------------------------------------------------------------昄L内?br /> (tng) (tng) (tng) (tng) (tng) v_phei := pindex * psize + psize;
 (tng) (tng) (tng) (tng) (tng) v_plow := v_phei - psize + 1;
 (tng) (tng) (tng) (tng) (tng) --Psql := 'select rownum rn,t.* from cd_ssxl t' ; (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) --要求必须包含rownum字段
 (tng) (tng) (tng) (tng) (tng) v_sql :='select * from ('|| psql || ') where rownum between '|| v_plow || ' and ' || v_phei;

 (tng) (tng) (tng) (tng) (tng) OPEN v_cur FOR v_sql;
 (tng) (tng) END dotnetpagination;

--**************************************************************************************

 (tng)procedure DotNetPageRecordsCount(
 (tng) Psqlcount in varchar2,
 (tng) Prcount (tng) (tng) out number
 (tng) )
 (tng) as

 (tng) (tng) v_sql varchar2(1000);
 (tng) (tng) v_prcount number;

 (tng) begin

 (tng) (tng) v_sql := 'select count(*) from (' || Psqlcount || ')';
 (tng) (tng) execute immediate v_sql into v_prcount;
 (tng) (tng) Prcount := v_prcount; (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) --q回记录L

 (tng) end DotNetPageRecordsCount;

 (tng)--**************************************************************************************
END dotnet;
/

prompt
prompt Creating package body PKG_TEST
prompt ==============================
prompt
CREATE OR REPLACE PACKAGE BODY pkg_test
AS
 (tng) (tng) PROCEDURE get (p_id in NUMBER, p_rc OUT myrctype)
 (tng) (tng) IS
 (tng) (tng) (tng) (tng) (tng) sqlstr (tng) (tng) VARCHAR2 (500);
 (tng) (tng) BEGIN
 (tng) (tng) (tng) (tng) (tng) IF p_id = 0
 (tng) (tng) (tng) (tng) (tng) THEN
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) OPEN p_rc FOR
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) SELECT phone, msg_content, gateid
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) FROM wwchat_del_log
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) WHERE ROWNUM < 100;
 (tng) (tng) (tng) (tng) (tng) ELSE
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) sqlstr :=
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 'SELECT phone,msg_content,gateid FROM wwchat_del_log where rownum<100';

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) OPEN p_rc FOR sqlstr USING p_id;
 (tng) (tng) (tng) (tng) (tng) END IF;
 (tng) (tng) END get;
END pkg_test;
/

prompt
prompt Creating package body PKG_TEST_FUNCTION
prompt =======================================
prompt
CREATE OR REPLACE PACKAGE BODY pkg_test_function
AS
--函数?br /> (tng) (tng) FUNCTION get (intid NUMBER)
 (tng) (tng) (tng) (tng) (tng) RETURN myrctype
 (tng) (tng) IS
 (tng) (tng) (tng) (tng) (tng) rc (tng) (tng) (tng) (tng) (tng) (tng) myrctype; (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) --定义ref cursor变量
 (tng) (tng) (tng) (tng) (tng) sqlstr (tng) (tng) VARCHAR2 (500);
 (tng) (tng) BEGIN
 (tng) (tng) (tng) (tng) (tng) IF intid = 0
 (tng) (tng) (tng) (tng) (tng) THEN
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) --?rn)态测试,直接用select语句直接q回l果
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) OPEN rc FOR
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) SELECT phone, msg_content, gateid
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) FROM wwchat_del_log
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) WHERE ROWNUM < 100;
 (tng) (tng) (tng) (tng) (tng) ELSE
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) --动态sql赋|?w_id来申明该变量从外部获?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) sqlstr :=
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 'select id,name,sex,address,postcode,birthday from student where id=:w_id';

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) --动态测试,用sqlstr字符串返回结果,用using关键词传递参?br /> (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) OPEN rc FOR sqlstr USING intid;
 (tng) (tng) (tng) (tng) (tng) END IF;

 (tng) (tng) (tng) (tng) (tng) RETURN rc;
 (tng) (tng) END get;
END pkg_test_function;
/



]]>
SQL Server数据库的备䆾和恢复措?/title><link>http://www.tkk7.com/xine/articles/49679.html</link><dc:creator>【Xine】中文站</dc:creator><author>【Xine】中文站</author><pubDate>Thu, 01 Jun 2006 08:37:00 GMT</pubDate><guid>http://www.tkk7.com/xine/articles/49679.html</guid><wfw:comment>http://www.tkk7.com/xine/comments/49679.html</wfw:comment><comments>http://www.tkk7.com/xine/articles/49679.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/xine/comments/commentRss/49679.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/xine/services/trackbacks/49679.html</trackback:ping><description><![CDATA[ <strong>一、备份数据库</strong> <br /> <br />1、打开SQL企业理器,在控制台根目录中依次点开Microsoft SQL Server<br />2、SQL Serverl?->双击打开你的服务?->双击打开数据库目?br />3、选择你的数据库名Uͼ如论坛数据库ForumQ?->然后点上面菜单中的工?->选择备䆾数据?br />4、备份选项选择完全备䆾Q目的中的备份到如果原来有\径和名称则选中名称点删除,然后Ҏ(gu)加,如果原来没有路径和名U则直接选择dQ接着指定路径和文件名Q指定后点确定返回备份窗口,接着点确定进行备?<br /><br /><b>二、还原数据库</b><br /><br />1、打开SQL企业理器,在控制台根目录中依次点开Microsoft SQL Server<br />2、SQL Serverl?->双击打开你的服务?->点图标栏的新建数据库图标Q新建数据库的名字自行取<br />3、点?yn)L建好的数据库名称Q如论坛数据库ForumQ?->然后点上面菜单中的工?->选择恢复数据?br />4、在弹出来的H口中的q原选项中选择从设?->炚w择讑֤-->Ҏ(gu)?->然后选择你的备䆾文g?->d后点定q回Q这时候设备栏应该出现(zhn)刚才选择的数据库备䆾文g名,备䆾号默认ؓ(f)1Q如果?zhn)对同一个文件做q多ơ备份,可以点击备䆾h边的查看内容Q在复选框中选择最新的一ơ备份后点确定)(j)-->然后点击上方常规旁边的选项按钮<br />5、在出现的窗口中选择在现有数据库上强制还原,以及(qing)在恢复完成状态中选择使数据库可以l箋q行但无法还原其它事务日志的选项。在H口的中间部位的数据库文gq原里要按照你SQL的安装进行设|(也可以指定自q目录Q,逻辑文g名不需要改动,U至物理文g名要Ҏ(gu)你所恢复的机器情况做改动Q如(zhn)的SQL数据库装在D:\Program Files\Microsoft SQL Server\MSSQL\DataQ那么就按照(zhn)恢复机器的目录q行相关改动改动Qƈ且最后的文g名最好改成?zhn)当前的数据库名(如原来是bbs_data.mdfQ现在的数据库是forumQ就Ҏ(gu)forum_data.mdfQ,日志和数据文仉要按照这L(fng)方式做相关的改动Q日志的文g名是*_log.ldfl尾的)(j)Q这里的恢复目录(zhn)可以自p|,前提是该目录必须存在Q如(zhn)可以指定d:\sqldata\bbs_data.mdf或者d:\sqldata\bbs_log.ldfQ,否则恢复报?br />6、修改完成后Q点M面的定q行恢复Q这时会(x)出现一个进度条Q提C恢复的q度Q恢复完成后pȝ?x)自动提C成功,如中间提C报错,误录下相关的错误内容ƈ询问对SQL操作比较熟?zhn)的h员,一般的错误无非是目录错误或者文件名重复或者文件名错误或者空间不够或者数据库正在使用中的错误Q数据库正在使用的错误?zhn)可以试关闭所有关于SQLH口然后重新打开q行恢复操作Q如果还提示正在使用的错误可以将SQL服务停止然后重v看看Q至于上q其它的错误一般都能按照错误内容做相应改动后即可恢?br /><br /><b>三、收~数据库</b><br /><br />一般情况下QSQL数据库的收羃q不能很大程度上减小数据库大,其主要作用是收羃日志大小Q应当定期进行此操作以免数据库日志过?br />1、设|数据库模式为简单模式:(x)打开SQL企业理器,在控制台根目录中依次点开Microsoft SQL Server-->SQL Serverl?->双击打开你的服务?->双击打开数据库目?->选择你的数据库名Uͼ如论坛数据库ForumQ?->然后点击右键选择属?->选择选项-->在故障还原的模式中选择“简单”,然后按确定保?br />2、在当前数据库上点右键,看所有Q务中的收~数据库Q一般里面的默认讄不用调整Q直接点定<br />3?font color="blue">收羃数据库完成后Q徏议将(zhn)的数据库属性重新设|ؓ(f)标准模式Q操作方法同W一点,因ؓ(f)日志在一些异常情况下往往是恢复数据库的重要依?/font><br /><br /><b>四、设定每日自动备份数据库</b><br /><br /><font color="red">强烈有条件的用户q行此操作!</font><br />1、打开企业理器,在控制台根目录中依次点开Microsoft SQL Server-->SQL Serverl?->双击打开你的服务?br />2、然后点上面菜单中的工具-->选择数据库维护计划器<br />3、下一步选择要进行自动备份的数据-->下一步更新数据优化信息,q里一般不用做选择-->下一步检查数据完整性,也一般不选择<br />4、下一步指定数据库l护计划Q默认的?周备份一ơ,点击更改选择每天备䆾后点定<br />5、下一步指定备份的盘目录Q选择指定目录Q如(zhn)可以在D盘新Z个目录如Qd:\databakQ然后在q里选择使用此目录,如果(zhn)的数据库比较多最好选择为每个数据库建立子目录,然后选择删除早于多少天前的备份,一般设?Q?天,q看(zhn)的具体备䆾要求Q备份文件扩展名一般都是bakq默认?br />6、下一步指定事务日志备份计划,看?zhn)的需要做选择-->下一步要生成的报表,一般不做选择-->下一步维护计划历史记录,最好用默认的选项-->下一步完?br />7、完成后pȝ很可能会(x)提示Sql Server Agent服务未启动,先点定完成计划讑֮Q然后找到桌面最双状态栏中的SQLl色图标Q双ȝ开Q在服务中选择Sql Server AgentQ然后点击运行箭_(d)选上下方的当启动OS时自动启动服?br />8、这个时候数据库计划已经成功的运行了(jin)Q他按照?zhn)上面的设|进行自动备?<br /><br />修改计划Q?br />1、打开企业理器,在控制台根目录中依次点开Microsoft SQL Server-->SQL Serverl?->双击打开你的服务?->理-->数据库维护计?->打开后可看到你设定的计划Q可以进行修Ҏ(gu)者删除操?<br /><br /><b>五、数据的转移Q新建数据库或{UL务器Q?/b><br /><br />一般情况下Q最好用备份和q原操作来进行{UL据,在特D情况下Q可以用导入导出的方式进行{U,q里介绍的就是导入导出方式,导入导出方式转移数据一个作用就是可以在收羃数据库无效的情况下用来减(收羃Q数据库的大,本操作默认ؓ(f)(zhn)对SQL的操作有一定的?jin)解Q如果对其中的部分操作不理解Q可以咨询动|相关h员或者查询网上资?br />1、将原数据库的所有表、存储过E导出成一个SQL文gQ导出的时候注意在选项中选择~写索引脚本和编写主键、外键、默认值和(g)查约束脚本选项<br />2、新建数据库Q对新徏数据库执行第一步中所建立的SQL文g<br />3、用SQL的导入导出方式,Ҏ(gu)数据库导入原数据库中的所有表内容<img src ="http://www.tkk7.com/xine/aggbug/49679.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/xine/" target="_blank">【Xine】中文站</a> 2006-06-01 16:37 <a href="http://www.tkk7.com/xine/articles/49679.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL Server“数据库l护计划?/title><link>http://www.tkk7.com/xine/articles/49678.html</link><dc:creator>【Xine】中文站</dc:creator><author>【Xine】中文站</author><pubDate>Thu, 01 Jun 2006 08:36:00 GMT</pubDate><guid>http://www.tkk7.com/xine/articles/49678.html</guid><wfw:comment>http://www.tkk7.com/xine/comments/49678.html</wfw:comment><comments>http://www.tkk7.com/xine/articles/49678.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/xine/comments/commentRss/49678.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/xine/services/trackbacks/49678.html</trackback:ping><description><![CDATA[ <p> <strong> <font color="#004fc6">SQL Server“数据库l护计划?</font> </strong> </p> <p> <span id="hjlnrcv" class="main"> <span id="ekjehpg" class="myp111"> <font id="zoom">作ؓ(f)|管员,无论其管理的|络的规模是大还是小Q在日常的管理中除了(jin)l护|络q稳q行、及(qing)时排除网l故障、保护网l安全等工作以外Q备份网l中关键数据也是其中的一个非帔R帔R要的工作环节?|络中的各种故障无非分两种QY件故障和g故障。对于“硬件故障”可以通过l修或更换硬件设备得到及(qing)时解冻I对于“Y件故障”则可以通过重新安装或升UY件、重做网l或应用软gpȝ{方法及(qing)时解冻I而且用此Ҏ(gu)来解决网l故障大多需要一些基的、关键的数据支持才能得以恢复正常。但是,|络中诸如此cȝ关键数据(特别是“应用Y件系l”中的关键数?的损坏或丢失Q绝大部分是无法恢复和I补的。即使可以恢复部分数据,弥补它们所p的代?诸如旉、h力、胦(ch)力、物力等)都可能远q超Z(jin)公司的承受能力?<br /><br />所以说Q注重数据的备䆾工作是网员日常理工作中的必须时刻x(chng)的一Q务,也是必须周期性重复操作的一工作?<br /><br /><b>目录 <br /><br /><a >现行备䆾{略</a><br /><a >具体实现步骤</a><br /><a >l束?/a></b><br /><br /><b><font color="#330099"><a name="1">现行备䆾{略</a></font></b><br /><br />我公司在l徏局域网Ӟ考虑到商业企业的特点Q仔l考量?jin)购、销、存?sh)大环节中发生的各种数据及(qing)其存储问题后,选定?jin)以Windows 2000 Server为操作系l,SQL Server 2000为数据库q_来搭建局域网的应用系l的软gq_Q以|线体将购、销、存{核?j)部门的计算机通过局域网q_紧密地连接v来。这P各个核心(j)部门每天的Q何一W业务都?qing)时地、动态地存储到公司局域网的核?j)Dell服务器上的SQL Server 2000数据库中Qƈ以此为基q_向各Ҏ(gu)供所需的各U数据服务?<br /><br />因此Q自公司局域网开始正式运作之日vQ作为网员的我非常注重对局域网中的关键数据——特别是q些业务数据的备份工作。同Ӟ我也希望备䆾数据的Y件能够实C下自动功能?<br /><br />功能1Q能够在每天的某个固定的时刻(如夜?:00:00Q当然这个时间是可以自主讑֮?对包含所有业务数据库在内的所有关键数据库q行一ơ“完全备份”?<br /><br />功能2Q能够在每天?:00:00?3:59:59q段旉内,每间?个小时对功能1中所涉及(qing)到的各个数据库的事务日志q行“差异备份”?<br /><br />功能3Q每天都能够保留功能1和功?中所生成的数据库和事务日志的最q两天的备䆾(卻I(x)前一天的和前两天?Q而且能够自动地删除久于两天前的所有数据库和事务日志的备䆾?<br /><br />功能4Q定?如每个星期一?所有关键数据库的完全备份的副本备䆾到磁带或其它存储介质?q部分工作可能需要手工完??<br /><br />于是Q围l这些功能的实现Q在日常理工作中,我尽可能地尝试了(jin)各种备䆾数据的Y件和Ҏ(gu)Q如Windows 2000自带的“备份”工兗SQL Server 2000自带的“备份”功能等。这些备份Y件和Ҏ(gu)的功能各有千U,但是都存在以下缺点:(x) <br /><br />一U就是需要h工干预,无法实现自动备䆾(如Windows 2000自带的“备份”工?。如果采用这U方法,必LMh工手动备份,万一哪天因ؓ(f)出差或其它原因没有进行备份,而这时又出现服务器或数据故障的话Q那ȝ(ch)大?jin)?<br /><br />另一U就是能够实现自动备份,但是旧的备䆾不能被自动地删除(如SQL Server 2000自带的“备份”功?。如果采取这U方法,必d(qing)时地手工删除旧的备䆾Q否则再大的盘?sh)?x)q速地被用完?<br /><br />在相互比较后Q我q是军_采用W二U——SQL Server 2000自带的“备份”功能对关键数据库进行备份,因ؓ(f)它能够实现“自动备份”功能,比第一U略强。所以,在一D|期内Q我每天上班后的W一件事是先检查一下备份目录下各种数据的新的备份,然后手工删除旧的备䆾数据。这U做法一度让我很是苦恹{?<br /><br />一天,我在利用SQL Server 2000的“帮助”查询某个Transact-SQL语句的语义解释时无意中阅d“自动化理d”的内容。从头到֜仔细阅读后,我不由得眼睛一亮,原来SQL Server 2000本n自带?jin)一个能够实现我的备份要求的、强大的功能——“数据库l护计划”。于是我立刻按照q部分内容的提示Q以一个数据库验样本一步一步地操作Q成功地创徏?jin)一个数据库l护计划。经q一个星期的试运行,q个计划果然能够实现自动备䆾调度Q以?qing)自动删除旧的数据备份,完全能够满我的备䆾要求?<br /><br />从那时vQ我利用SQL Server 2000的“数据库l护计划”备份所有关键数据库Q而且严格地、定期地执行功能4Q每个星期五完全备份的数据库备份到带和局域网中其它客h(主要是用于网l管理的|管PC)的硬盘(sh)。这样做的目的是Q能同时异地保存?sh)䆾相同的备份,减少故障带来的损失?<br /><br />而且Q通过SQL Server 2000的“数据库l护计划”,我现在能够较L地备份所需各种数据Q方便地理其备份,相应地减了(jin)日常工作量,也减M(jin)部分工作压力?<br /><br /><b><fon color="#330099"><a name="2">具体实现步骤</a></fon></b></font> <br /> <br /> <b>目录 <br /><br /><a >W一步:(x)打开SQL Server“企业管理器”窗?/a><br /><a >W二步:(x)扑ֈ“数据库l护计划”功?/a><br /><a >W三步:(x)创徏“数据库l护计划?/a><br /><a >W四步:(x)l护和管理“数据库l护计划?/a><br /><a >W五步:(x)启动SQL Server 2000代理以便执行“作业?/a><br /><a >W六步:(x)(g)查结?/a></b> <br /> <br />“数据库l护计划”功能在SQL Server 2000的“企业管理器”中可以扑ֈ?<br /><br />说明Q?<br /><br />1.以下操作是在服务器的Windows 2000 Server上进行操作的。在Window 9Xpȝ上操作相同?<br /><br />2.׃SQL Server 2000执行备䆾时将产生许多文g(特别是在q行事务日志备䆾?Q所以徏议按数据库名U分别徏立独立的备䆾目录q行存储?<br /><br />3.以下所有操作过E当中一般不?x)对数据库的使用产生影响?<br /><br /><b><a name="20">W一步:(x)打开SQL Server“企业管理器”窗?/a></b><br /><br />用鼠标单MQ务栏上的“开始”按钮中的“程?P)”菜单下的“Microsoft SQL Server”子菜单中的“企业管理器”菜单项Q即可打开SQL Server 2000的“企业管理器”窗体?<br /><br /><b><a name="21">W二步:(x)扑ֈ“数据库l护计划”功?/a></b><br /><br />在“企业管理器”窗体中左侧的树(wi)型选项卡中Q用鼠标单击?”图标扩展开“控制台根目录”下的“Microsoft SQL Servers”,可以看到其下有一个“SQL Serverl”;接着l箋扩展开“SQL Serverl”,此时可以看到其下出现?jin)服务器的名U??中的“JXNC-SERVER”就是我的服务器的名U?Q再l箋扩展开此服务器Q可以看到其下列Z(jin)诸如“数据库”、“数据{换服务”等目Q最后单几Z管理”项目,可以看到其下存在一个“数据库l护计划?如图1)?<br /><br /></span> </span> </p> <center> <img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.pcbookcn.com/img_article/2005131113441734.gif" onload="javascript:if(this.width>500)this.style.width=500;" /> <br /> <br />?</center> <p> <br /> <br />单击“数据库l护计划”项目,在“企业管理器”窗口右侧将?x)显C出已经存在的维护计划项目。每个维护计划均包括以下目Q?<br /><br />1.名称Q就是维护计划的名称。此名称可以自定义,中英文皆可?<br /><br />2.数据库:(x)是l护计划所q行l护的数据库的名U?<br /><br />因ؓ(f)一个维护计划允许同时维护多个数据库Q所以此处可以显C出多个数据库的名称(在图1中可以看到名为“系l数据库备䆾”的数据库维护计划中的“数据库”就包括三个数据库:(x)master、model和msdb)?<br /><br />3.服务器:(x)也就是维护计划所l护的数据库所处的服务器的名称。?local)”表C是本地服务器?<br /><br />4.对策Q是指维护计划所需要进行的具体l护工作的内宏V?<br /><br />?中有3个“数据库l护计划”均为“数据库备䆾Q事务日志备份”,它的含义是q些l护计划中同时对所指定的数据库q行“数据库”和“事务日志”的备䆾?<br /><br /><b><a name="22">W三步:(x)创徏“数据库l护计划?/a></b><br /><br />鼠标叛_“数据库l护计划”项目,选择“新建维护计?P)”功能,打开“数据库l护计划向导”窗体,依照此向D够创Z个新的“数据库l护计划”?<br /><br />步骤1Q单?“下一?N)”按钮,打开“选择数据库”窗?如图2)。在此窗体中可以选定一个或多个的数据库作ؓ(f)操作对象。ؓ(f)?jin)叙q方便,我在此只选择?jin)一个数据库“regie”?<br /><br /></p> <center> <img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.pcbookcn.com/img_article/2005131113441580.gif" onload="javascript:if(this.width>500)this.style.width=500;" /> <br /> <br />?</center> <p> <br /> <br />步骤2Q单d2中的“下一?N)”按钮,打开“更新数据优化信息”窗?如图3)?<br /><br /></p> <center> <img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.pcbookcn.com/img_article/2005131113442621.gif" onload="javascript:if(this.width>500)this.style.width=500;" /> <br /> <br />?</center> <p> <br /> <br />在此H体中可以对数据库中的数据和索引重新q行l织Q以?qing)能够设定在满一定条件的情况下,l护计划自动删除数据库中的未使用的空_(d)以便提高性能?<br /><br />但要注意的是Q在此窗体中Q只要选定?jin)“重新组l数据和索引[R]”复选框Q“更新查询优化器所使用的统计。示例[D]”复选框失?变成灰色Q不能选择)。而且“重新组l数据和索引[R]”复选框和“从数据库文件中删除未用的I间[M]”复选框二者只要有一个被选中Q其下的“调度[S]”功能才有效。单几Z更改[C]”按钮可以对“调度”进行自定义?<br /><br />各位读者可以根据自w情况决定是否选用其中的功能。当然也可以通过单击“帮助”按钮来查看各功能的具体含义?<br /><br />在此H体中能够便捷地讑֮每项作业的持l运行时间和q行的频率。完成自q讄后,一定要选定右上角的“启用调度[B]”复选框Q这样一个作业调度才真正完成了(jin)?<br /><br />步骤3Q单d3中的“下一?N)”按钮,打开“检查数据库完整性”窗体?<br /><br />在此H体中可以设定维护计划在备䆾数据库前自动(g)查数据库的完整性,以便(g)由于硬件或软g错误而导致数据的不一致。在此窗体中只有先选定?jin)“检查数据库完整性[H]”复选框Q其下的“备份之前执行这些检查[R]”和“调度[S]”功能才有效。单几Z更改[C]”按钮可以对“调度”进行自定义?<br /><br />各位读者可以自d定,较好的一U做法就是选中“检查数据库完整性[H]”复选框(推荐Q因为有可能?x)修正一些错??<br /><br />步骤4Q在“检查数据库完整性”窗体中的“下一?N)”按钮,打开“指定数据库备䆾计划”窗体?<br /><br />如需Ҏ(gu)据库q行备䆾Q则必须选定“作为维护计划的一部分来备份数据库[A]”复选框Q而且必须指定存储备䆾文g的位|:(x)带[P]或磁盘[K]?<br /><br />如果选择“磁盘[K]”作为数据库备䆾的位|,讑֮“调度”后单击“下一?N)”按钮则昄“指定备份磁盘目录”窗?如图4)?<br /><br /></p> <center> <img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.pcbookcn.com/img_article/2005131113442360.gif" onload="javascript:if(this.width>500)this.style.width=500;" /> <br /> <br />?</center> <p> <br /> <br />在图4中,可以具体指定存储备䆾文g的目?可以使用默认的目录,也可自定?、备份文件扩展名Q而且能够指示备䆾计划自动地删除早于某个时??中设定的是?天”,也就是说两天前的所有备份文件将被自动地删除Q只留下最q两天的备䆾)的备份文件。而图4中的“ؓ(f)每个数据库创建子目录[C]”功能只是在步骤1中选择?jin)多个数据库时才有用Q对于一个数据库作用不大。设定后Q单几Z下一?N)”按钮则昄“指定事务日志备份计划”窗体?<br /><br />如果选择“磁带[P]”作为数据库备䆾的位|,讑֮“调度”后单击“下一?N)”按钮则直接昄“指定事务日志备份计划”窗体?<br /><br />步骤5Q指定“事务日志备份计划”的q程与步?的过E完全相同,只是在设定“调度”上E有差别(因ؓ(f)我的要求是数据库每天备䆾一ơ,事务日志?时备䆾一??<br /><br />步骤6Q对事务日志的备份计划全部设定后Q单几Z下一?N)”按钮则昄“要生成的报表”窗体?<br /><br />在此H体中可以指定用于存放整个备份计划执行过E中的日志的目录。设定过E与?的操作及(qing)其相伹{?<br /><br /></p> <center> <img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.pcbookcn.com/img_article/2005131113443371.gif" onload="javascript:if(this.width>500)this.style.width=500;" /> <br /> <br />?</center> <p> <br /> <br />步骤7Q完成步?后,单击“下一?N)”按钮则昄“维护计划历史纪录”窗体?<br /><br />在此H体中可以指定如何存储此l护计划的历史纪?是存攑֜“本地服务器”上Q还是在“远E服务器”上)Q而且通过指定表中的行数可以限定历史纪录的存储大小?<br /><br />步骤8Q完成步?后,单击“下一?N)”按钮则昄“正在完成数据库l护计划向导”窗?如图5)?<br /><br />在此H体中可以自定义一个“计划名[P]?推荐Q这样便于管理和识别)Q当然也可用默认的“计划名[P]”。而且q可以通过对“计划名[P]”下的文本框中的内容q行认Q如有误Q则可通过单击H体中的“上一步[B]”按钮退回到相应的窗体进行修攏V?<br /><br />步骤9Q完成步?后,单击“完成”按钮,则显C“维护计划已创徏成功。”的提示框,再单?“确定”按钮即成功地设定了(jin)一个新的数据库l护计划?<br /><br />从图6中可以看刎ͼ已经成功的创Z(jin)一个新的数据库l护计划——“regie备䆾”?<br /><br /><b><a name="23">W四步:(x)l护和管理“数据库l护计划?/a></b><br /><br />W三步完成后Q对各个“数据库l护计划”的日常l护和管理都非常方便Q只需要双几Z数据库l护计划”即可对W三步中所涉及(qing)的内容进行变更、修正?<br /><br /></p> <center> <img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.pcbookcn.com/img_article/2005131113444797.gif" onload="javascript:if(this.width>500)this.style.width=500;" /> <br /> <br />?</center> <p> <br /> <br />如图6所C,鼠标叛_“regie备䆾”,单击“属性[R]”,或者直接双几Zregie备䆾”,打开“数据库l护计划”窗体。在此窗体中集成?jin)第三步中涉及(qing)到的所有功能,每项功能都能L修改Q修改过E与W三步中的相应步骤一栗?<br /><br />但需要说明的是,在设定图7中的“报表”选项卡下的“文本报表”中的“删除早于此旉的文本报表文件[F]”选项Ӟ也就是第三步中的步骤6中的内容Q无论?zhn)其讑֮成“分钟”、“小时”、“天”,q是“月”,创徏成功后都被自动地更正ؓ(f)“周”,而且以后无论如何修改Q保存后再去查看时它仍将昄为“周”,但不意味着其它选项无效Q其它选项仍然有效?<br /><br /></p> <center> <img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.pcbookcn.com/img_article/2005131113444112.gif" onload="javascript:if(this.width>500)this.style.width=500;" /> <br /> <br />?</center> <p> <br /> <br /> <b> <a name="24">W五步:(x)启动SQL Server 2000代理以便执行“作业?/a> </b> <br /> <br />完成W三步后Q还需启动SQL Server 2000 Agent(代理)Q以便执行“数据库l护计划”作业?<br /><br />与展开SQL Server 2000“数据库l护计划”的步骤一P在“管理”项目中Q可以发现存在一个“SQL Server 代理?如图8)?<br /><br /></p> <center> <img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.pcbookcn.com/img_article/2005131113445784.gif" onload="javascript:if(this.width>500)this.style.width=500;" /> <br /> <br />?</center> <p> <br /> <br />单击“SQL Server 代理”下的“作业”子菜单Q在“企业管理器”窗口右侧将?x)显C出已经存在的作业项?在图8中可以看到已l存?7个作业项?。每个作业项目均包括以下数据列:(x) <br /><br />1.名称Q当然是指作业的名称Q可以自定义Q中英文皆可。ؓ(f)?jin)理解方便,用中英文l合?<br /><br />每当新徏立一个“数据库l护计划”,自动生成以下默认名U的作业Q?<br /><br />(1)当新建的“数据库l护计划”中讑֮?jin)“备份数据库”功能时Q将生成默认名ؓ(f)“DB l护计划?*****’的 DB 备䆾作业”的作业?<br /><br />(2)当新建的“数据库l护计划”中讑֮?jin)“备份事务日志”功能时生成默认名为“DB l护计划?*****’的 事务日志备䆾作业(多服务器)”的作业?<br /><br />以上(1)?2)中的?*****”处显C“数据库l护计划”中的“计划名?也就是第三步步骤8中设定的“计划名??<br /><br />2.分类Q指明该作业当前所属的cd。缺省gؓ(f)“[未分c?本地)]”?<br /><br />3.启用Q指明该作业是否处于“启用”状态?<br /><br />4.可运行:(x)指明该作业是否处于“可q行”状态?<br /><br />5.已调度:(x)指明该作业是否处于“已调度”状态?<br /><br />6.状态:(x)指明该作业当前的q行状态—不在运行、正在运行?<br /><br />7.上次q行状?开始日?Q显C最q一ơ运行该作业后的状?“已成功”、“失败”,q是“未知?Q和q行时的日期和时间?<br /><br />8.下次q行日期Q指明下一ơ运行该作业的日期和旉?<br /><br />如图8所C,鼠标叛_“regie完全备䆾”作业,单击“属性[R]”,或者直接双几Zregie完全备䆾”作业,打开作业的“属性”窗体。在此窗体中集成?jin)该作业的详l的配置V每个配|项都能L修改。“属性”窗体中有四个选项卡:(x) <br /><br />?常规Q在此选项卡中可以重新讑֮作业名称(“名U[N]”文本框)、修改作业的分类(“分c[Y]”下拉框)、指定作业的所有?“所有者[W]”下拉框)、简单地对作业进行描q?“描q[R]”文本框)Q以?qing)决定是否启用此作?“启用[E]”复选框)?<br /><br />?步骤Q在此选项卡中可以新徏、插入新的步骤,删除、编辑已有的步骤?<br /><br />单击“编辑[E]”按钮,在“编辑作业步骤”窗体中的“常规”选项卡中的“命令[M]”文本框中可以查阅到该作业的执行语句?<br /><br />?调度Q在此选项卡中可以新徏调度、新报,删除、编辑已有的调度?<br /><br />?通知Q在此选项卡中可以讑֮作业完成?卛_作业成功时、作业失败时)执行的操作,卛_送电(sh)子邮件、传呼操作员、发出网l警报信息、写入Windows应用E序事g日志、自动删除等操作?<br /><br /><b><a name="25">W六步:(x)(g)查结?/a></b><br /><br />l过上述五个步骤后,一个完整的备䆾数据库的计划徏立v来了(jin)。可以通过“资源管理器”来(g)查备份目录下是否存在相应地备份文件?<br /><br />l过长时间的使用Q如果以“保?天的数据库完全备份和2天的每个一时的事务日志备份”的备䆾{略来正地建立?jin)一个完整的数据库维护计划的话,无论何时查看相应备䆾目录下的文gQ都应该存在102个文Ӟ(x) <br /><br />?个数据库的完整备份,?个以“数据库名_db_yyyy mmddhhss.bak”格式ؓ(f)文g名的文gQ?<br /><br />?3个与数据库完整备份相对应的操作过E的记录报告文gQ即以“数据库名?“备?_yyyymmddhhss.txt?格式为文件名的文Ӟ <br /><br />?48个事务日志的差异备䆾Q即2天各24个以“数据库名_tlog_yyyymmddhhss.trn”格式ؓ(f)文g名的文gQ?<br /><br />?49个与事务日志的差异备份对应的操作q程的记录报告文Ӟ即以“数据库名?“备?_yyyymmddhhss.txt?格式为文件名的文件?<br /><br />以上文g名中Q“数据库名”ؓ(f)W三步的步骤一中选定的数据库的名Uͼ“y(c)yyymmddhhss”是旉戻I其格式ؓ(f)Q“y(c)yyy”指“年?4位数?Q“mm”指“月?2位数|不2位的补??Q“dd”指“日?2位数|不2位的补??,“hh”指“时?2位数|不2位的补??Q“ss”指“分?2位数|不2位的补???<br /><br /><b><font color="#330099"><a name="3">l束?/a></font></b><br /><br />对于一个企业而言Q日常运作中发生的各U业务所产生的所有数据,l过计算Z断地日积月篏Q逐渐成ؓ(f)公司的一U胦(ch)富和资本。利用计机Q可以便捷地l计分析部分或全部的数据Q通过各种形式的反?如图表、表格等)Q给公司的决{层用于参考,便于为公司的今后决策提供指导和帮助。正Z此,q些数据的h(hun)值随着旉的gl正呈现出几何速度的增ѝ因此我认ؓ(f)Q对于数据的备䆾工作是网员日常工作中最重要的工作之一?<br /><br />通过q次“数据库l护计划”的创徏Q我略有感受Q?<br /><br />1.l过q么长时间的q用Q我认ؓ(f)“数据库l护计划”仍然存在不之处,虽说“数据库l护计划”功能很强大Q但是它最l的l果是生成一作业,由“SQL Server 2000 Agent”服务定期执行它来完成对数据库的备䆾工作。这p求“SQL Server 2000 Agent”服务能够正常地“运行”。从多次安装来看Q在Windows 2000pȝ中“SQL Server 2000 Agent”服务能够正常运行,而且能随Windows 2000的启动自动运行。但是在Window 98pȝ(包括W二?中,却不能正常运行。所以说Q在Windows 98pȝ中即使依照上q步骤成功地创徏?jin)“数据库l护计划”,也会(x)因ؓ(f)“SQL Server 2000 Agent”服务无法启动而变得没有Q何作用?<br /><br />2.之所以选择“完全备份”,主要在于Q在q行完全备䆾ӞSQL Server?mdf与其对应?ldf文gq行Ҏ(gu)Q删除一些旧的、不必要的日志,然后?mdf?ldf文gq行合ƈ、压~后一起存储?<br /><br />?优点是:(x)能最大可能地、完整地保存数据库?<br /><br />?~点是:(x)存储量随着数据库的增大而增大,存储旉也将随着数据库的增大而gѝ?<br /><br />3.在徏立“数据库l护计划”过E,各位读者应该尽可能地去使用各种选项、功能,以便加深对“数据库l护计划”的理解和掌握?<br /><br />4.虽然Internet上有许多W三方备份Y件和工具Q但是大多数是共享版。由于担?j)知识权问题、病毒问题和其它问题Q所以我没有试用q些W三方Y件。这L(fng)话,它们的性能我就不清楚了(jin)。也许这些Y件的功能非常强大Q能够满x(chng)多的、更高的要求。在q里我只是就Windows 2000和SQL Server 2000自带的“备份”工具和软gq行一个比较?img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.pcbookcn.com/down_info.asp?id=2389" width="1" onload="javascript:if(this.width>500)this.style.width=500;" border="0" /><br /></p> <img src ="http://www.tkk7.com/xine/aggbug/49678.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/xine/" target="_blank">【Xine】中文站</a> 2006-06-01 16:36 <a href="http://www.tkk7.com/xine/articles/49678.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL Server 理常用的SQL和T-SQLhttp://www.tkk7.com/xine/articles/49676.html【Xine】中文站【Xine】中文站Thu, 01 Jun 2006 08:33:00 GMThttp://www.tkk7.com/xine/articles/49676.htmlhttp://www.tkk7.com/xine/comments/49676.htmlhttp://www.tkk7.com/xine/articles/49676.html#Feedback0http://www.tkk7.com/xine/comments/commentRss/49676.htmlhttp://www.tkk7.com/xine/services/trackbacks/49676.html
1. 查看数据库的版本  (tng) (tng)
 (tng) (tng) select @@version
 (tng) (tng)
2. 查看数据库所在机器操作系l参? (tng) (tng)
 (tng) (tng) exec master..xp_msver
 (tng) (tng)
3. 查看数据库启动的参数 (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) sp_configure
 (tng) (tng) (tng) (tng) (tng) (tng) (tng)
4. 查看数据库启动时闾b?tng) (tng) (tng) (tng) (tng)?
 (tng) (tng) select convert(varchar(30),login_time,120) from master..sysprocesses where spid=1
 (tng) (tng)
 (tng) (tng) 查看数据库服务器名和实例?br /> (tng) (tng) print 'Server Name...............: ' + convert(varchar(30),@@SERVERNAME) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) print 'Instance..................: ' + convert(varchar(30),@@SERVICENAME) (tng) (tng) (tng) (tng) (tng)

5. 查看所有数据库名称?qing)大?
 (tng) (tng) sp_helpdb
 (tng) (tng)
 (tng) (tng) 重命名数据库用的SQL
 (tng) (tng) sp_renamedb 'old_dbname', 'new_dbname'
 (tng) (tng)
6. 查看所有数据库用户d信息
 (tng) (tng) sp_helplogins
 (tng) (tng)
 (tng) (tng) 查看所有数据库用户所属的角色信息  (tng) (tng)
 (tng) (tng) sp_helpsrvrolemember
 (tng) (tng)
 (tng) (tng) 修复q移服务器时孤立用户?可以用的fix_orphan_user脚本或?a target="_blank">LoneUserq程
 (tng) (tng)
 (tng) (tng) 更改某个数据对象的用户属?br /> (tng) (tng) sp_changeobjectowner [@objectname =] 'object', [@newowner =] 'owner'
 (tng) (tng)
 (tng) (tng) 注意: 更改对象名的M部分都可能破坏脚本和存储q程?br /> (tng) (tng)
 (tng) (tng) 把一台服务器上的数据库用L(fng)录信息备份出来可以用add_login_to_aserver脚本
 (tng) (tng)
7. 查看链接服务? (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) sp_helplinkedsrvlogin
 (tng) (tng)
 (tng) (tng) 查看q端数据库用L(fng)录信? (tng) (tng)
 (tng) (tng) sp_helpremotelogin
 (tng) (tng)
8.查看某数据库下某个数据对象的大小
 (tng) (tng) sp_spaceused @objname
 (tng)
 (tng) (tng) q可以用sp_toptablesq程看最大的N(默认?0)个表
 (tng)
 (tng) (tng) 查看某数据库下某个数据对象的索引信息
 (tng) (tng) sp_helpindex @objname
 (tng) (tng)
 (tng) (tng) q可以用SP_NChelpindexq程查看更详l的索引情况
 (tng) (tng) SP_NChelpindex @objname
 (tng) (tng)
 (tng) (tng) clustered索引是把记录按物理顺序排列的Q烦(ch)引占的空间比较少?
 (tng) (tng) 寚w值DML操作十分频繁的表我徏议用非clustered索引和约束,fillfactor参数都用默认倹{?br />
 (tng) (tng) 查看某数据库下某个数据对象的的约束信?br /> (tng) (tng) sp_helpconstraint @objname
 (tng)
9.查看数据库里所有的存储q程和函?br /> (tng) (tng) use @database_name
 (tng) (tng) sp_stored_procedures

 (tng) (tng) 查看存储q程和函数的源代?br /> (tng) (tng) sp_helptext '@procedure_name'
 (tng) (tng)
 (tng) (tng) 查看包含某个字符串@str的数据对象名U?br /> (tng) (tng) select distinct object_name(id) from syscomments where text like '%@str%'
 (tng)
 (tng) (tng) 创徏加密的存储过E或函数在AS前面加WITH ENCRYPTION参数
 (tng)
 (tng) (tng) 解密加密q的存储q程和函数可以用sp_decryptq程
 (tng)
 (tng) (tng) (tng) (tng) (tng) (tng) 10.查看数据库里用户和进E的信息
 (tng) (tng) sp_who

 (tng) 查看SQL Server数据库里的活动用户和q程的信?br /> (tng) (tng) sp_who 'active'

 (tng) 查看SQL Server数据库里的锁的情?br /> (tng) (tng) sp_lock
 (tng) (tng)
 (tng) (tng) q程?--50是SQL Serverpȝ内部用的,q程号大?0的才是用L(fng)q接q程.

 (tng) (tng) spid是进E编?dbid是数据库~号,objid是数据对象编?br />
 (tng) (tng) 查看q程正在执行的SQL语句
 (tng) (tng) dbcc inputbuffer ()
 (tng) (tng) (tng) (tng) (tng) (tng)  (tng) (tng)
 (tng) 推荐大家用经q改q后?a target="_blank">sp_who3q程可以直接看到q程q行的SQL语句
 (tng) (tng) sp_who3
 (tng) (tng)
 (tng) (g)查死锁用sp_who_lockq程
 (tng) (tng) sp_who_lock  (tng) (tng)
 (tng) (tng)  (tng) (tng)
 (tng) (tng) (tng) (tng) (tng) (tng) 11.收羃数据库日志文件的Ҏ(gu)

 (tng) 收羃单恢复模式数据库日志Q收~后@database_name_log的大单位ؓ(f)M
 (tng) (tng) backup log @database_name with no_log
 (tng) (tng) dbcc shrinkfile (@database_name_log, 5)

 (tng) (tng) (tng) (tng) (tng) (tng) 12.分析SQL Server SQL 语句的方?
 (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) set statistics time {on | off}

 (tng) (tng) set statistics io {on | off}

 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 囑Ş方式昄查询执行计划
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 在查询分析器->查询->昄估计的评估计?D)-Ctrl-L 或者点dh里的囑Ş
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
 (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) 文本方式昄查询执行计划

 (tng) (tng) set showplan_all {on | off}
 (tng) (tng)
 (tng) (tng) set showplan_text { on | off }

 (tng) (tng) set statistics profile { on | off }
 (tng) (tng)

 (tng) (tng) (tng) (tng) (tng) (tng) 13.出现不一致错误时QNT事g查看器里?624号错误,修复数据库的Ҏ(gu)
 (tng)
 (tng) 先注释掉应用E序里引用的出现不一致性错误的表,然后在备份或其它机器上先恢复然后做修复操?br /> (tng)
 (tng) alter database [@error_database_name] set single_user
 (tng)
 (tng) 修复出现不一致错误的?br /> (tng)
 (tng) dbcc checktable('@error_table_name',repair_allow_data_loss)
 (tng)
 (tng) 或者可惜选择修复出现不一致错误的型数据库名
 (tng)
 (tng) dbcc checkdb('@error_database_name',repair_allow_data_loss)

 (tng) alter database [@error_database_name] set multi_user

 (tng) CHECKDB ?个参?

 (tng) repair_allow_data_loss 包括对行和页q行分配和取消分配以Ҏ(gu)分配错误、结构行或页的错误,
 (tng) 以及(qing)删除已损坏的文本对象Q这些修复可能会(x)D一些数据丢失?br /> (tng) 修复操作可以在用户事务下完成以允许用户回滚所做的更改?br /> (tng) 如果回滚修复Q则数据库仍?x)含有错误,应该从备份进行恢复?br /> (tng) 如果׃所提供修复{的缘故遗漏某个错误的修复Q则遗漏Q何取决于该修复的修复?br /> (tng) 修复完成后,请备份数据库?

 (tng) repair_fast q行的、不耗时的修复操作,如修复非聚集索引中的附加键?br /> (tng) q些修复可以很快完成Qƈ且不?x)有丢失数据的危险?

 (tng) repair_rebuild 执行?repair_fast 完成的所有修复,包括需要较长时间的修复Q如重徏索引Q?br /> (tng) 执行q些修复时不?x)有丢失数据的危险。?br /> (tng) (tng) (tng) (tng)
 (tng) 有兴还可以看看源自www.sqlservercentral.com的检查SQL Server全部信息?a target="_blank">sqlserver_all_aspect脚本


]]>
Inside SQL Server Maintenance Planshttp://www.tkk7.com/xine/articles/49671.html【Xine】中文站【Xine】中文站Thu, 01 Jun 2006 08:22:00 GMThttp://www.tkk7.com/xine/articles/49671.htmlhttp://www.tkk7.com/xine/comments/49671.htmlhttp://www.tkk7.com/xine/articles/49671.html#Feedback0http://www.tkk7.com/xine/comments/commentRss/49671.htmlhttp://www.tkk7.com/xine/services/trackbacks/49671.html Inside SQL Server Maintenance Plans

by Andrzej Kozlowski

 (tng)

Like a lot of database administrators who manage many SQL Server databases, I have problems with maintenance and administration tasks. Some of these are massive jobs, which have to be created and maintained to be sure that databases are robust and reliable. One of the tools I use often to make my life a little easier is the Database Maintenance Wizard, which is used to create SQL Server maintenance plans.

While the Database Maintenance Wizard, and the plans it creates are generally good, they are not always perfect. In addition, what is going on behind the scenes when a maintenance plan is running is not so obvious. So what I recently did was to find out what was going on behind the scene using the SQL Server Profiler.

To capture the Profiler trace (using SQL Server 2000), I used the predefined Profiler template called SQLProfilerStandard, with two modifications, using:

  • RPC: Starting
  • SQL: BatchStarting

instead of:

  • RPC: Completed
  • SQL: BatchCompleted

All the other trace configuration items were left the same. Those two changes to the SQLProfilerStandard template allow us easily to capture the relevant trace data.

 (tng)

Profiling Integrity Maintenance Plan Options

Next, I created a Maintenance Plan using the following Integrity options (see figure as a reference point) in order to see what SQL Server statements were used.

Then, I started the Profiler trace and ran the job created by the Maintenance Plan to see what the results would be. I then went back and changed some of the settings in the above screen to see what happened as options were changed.

Below are the results, formatted into a table for easy viewing.

Which Integrity Settings Were Used Profiler Trace Results Xp_Sqlmaint Syntax
Check database integrity, include indexes, attempt to repair any minor problems dbcc checkdb(Pubs, REPAIR_FAST) WITH NO_INFOMSGS -CkDBRepair
(not documented)
Check database integrity, include indexes Use pubs
dbcc checkdb WITH NO_INFOMSGS

Check database integrity, exclude indexes dbcc checkdb(Pubs, noindex) WITH NO_INFOMSGS -CkDBNoIdx
Perform the above tests before backing up the database or transaction log  (tng) -BkUpOnlyIfClean
(One of above CkDB depending on chosen settings)

Comments on this test run:

  1. Don’t use the option "Attempt to repair any minor problems" which causes DBCC Checkdb to be run with the option REPAIR_FAST. This option performs minor repair actions without risk of data loss. However, the given database must be in single-user mode to use this value, which presents problems if this is a production database.

  2. If database is not in single-user mode, DBCC Checkdb with REPAIR_FAST, will not be run, unfortunately the text or html report files will still report a success.

  3. By checking the option "Perform these tests before backing up the database or transaction log," SQL server modifies the backup jobs (full and log backup) by adding two option to the respective maintenance plans:

    · BkUpOnlyIfClean
    · CkDB | CkDBNoIdx | CkDBRepair

  4. Don’t use the above option if you are going to add transaction log backups to the same maintenance plan, as this will cause DBCC activity before each incremental backup, hurting performance

  5. "WITH NO_INFOMSGS" is used to suppress all informational messages


Profiling Optimization Maintenance Plan Options

In this step, I wanted to see happened under the covers when various Optimization options (see illustration below) from the Database Maintenance Wizard are traced with Profiler. As before, I will experiments with several different Optimization options, and run the resulting jobs manually in order to capture the traces.


Below are the results, formatted into a table for easy viewing.

Which Optimization Settings Were Used Profiler Trace Results Xp_Sqlmaint Syntax
Reorganize data and index pages, reorganize pages with the original amount of free space dbcc dbreindex(dbo.Table1,'', 0, sorted_data_reorg) (tng)
(for each table in database)
-RebldIdx 100
Reorganize data and index pages, change free space per page percentage to 30% dbcc dbreindex(dbo.Table1', '', 70, sorted_data_reorg) (tng)
(for each table in database)
-RebldIdx 30
Update the statistics used by the query optimizer, percentage of database to sample 30% UPDATE STATISTICS dbo.table1 WITH all, SAMPLE 30 PERCENT (for each table in database) -UpdOptiStats 30
Remove unused space from database files DBCC shrinkdatabase(test, 10, TRUNCATEONLY ) -RmUnusedSpace 2048 10


Comments on this test run:

  1. DBCC DBREINDEX uses free space as the inverse of the fill factor. So in the first row in the above table, free space = 0%, which is the same as a fill factor of 0. In second position we can see a value of 30% for free space, which is the same as a 70% fill factor.

  2. If you choose DBREINDEX for a database, an UPDATE STATISTIC is done automatically

  3. Even though the UPDATE STATISTIC command gives us the possibility to choose either a SAMPLE option of PERCENT or number of ROWS, the maintenance plan allows you only to specify PERCENT.

Profiling Other Maintenance Plan Options

I will not describe the database and log backup options of the Database Wizard because they are very straight-forward, and work like you would expect them to. However, I would like you to discuss some other maintenance plan options which are accessible only from xp_sqlmaint utility and not from the Maintenance Plan Wizard:

  • HtmlRpt "e:\mssql7\LOG\ak_test.html": Creates an HTML version of the database maintenance report.

  • DelHtmlRpt <time period>: Sets the retention cycle for HTML files, e.g. 3 WEEKS.

  • CkCat: Runs DBCC CHECKCATALOG.

  • CkAl, CkAlNoIdx: Runs DBCC NEWALLOC.

  • CkTxtAl: Runs DBCC TEXTALL.


Comments on These Commands:

  1. Be careful with the syntax of the above switches. They must be exactly as I listed above. For example if you type Htmlrpt (instead of HtmlRpt) the job will fail.

  2. Don’t use NEWALLOC and TEXTALL. They are included for backward compatibility. CHECKALLOC replaced NEWALLOC and CHECKTABLE TEXTALL. It’s better to use CHECKDB, which performs CHECKTABLE for each table in a database to check the integrity of the data, and CHECKALLOC to check allocation of all pages.

 (tng)

Maintenance Plan Tables

Now for some details on how maintenance plans are stored inside SQL Server. The more you know about this, the easier it will be for you to automate the gathering of useful information about your maintenance plans, if you so desire.

There are four tables in the msdb database which are store maintenance plan information:

  • sysdbmaintplan_databases: Contains one row for each database. Note that you can use special strings for group of databases like in the Database Maintenance Plan Wizard.


Sample Data From sysdbmaintplan_databases

plan_id (tng) database_name
36D539DF-7DE3-11D6-9855-00508BB3C376 WWW_ak
36D539E1-7DE3-11D6-9855-00508BB3C376 All Databases
36D539E2-7DE3-11D6-9855-00508BB3C376 All System Databases
36D539E3-7DE3-11D6-9855-00508BB3C376 All User Databases
  • sysdbmaintplans: Contains one row for each maintenance plan.

Sample Data From sysdbmaintplans (partial table)

Plan_id Plan_name date _created owner max _history _rows
00000000-0000-0000-0000-000000000000 All ad-hoc plans 11/13/98 3:10 REDMOND\_sqlbld 0
36D539DF-7DE3-11D6-9855-00508BB3C376 ak_test_www_ak 11/14/98 3:10 NT\TEST 1000
36D539E1-7DE3-11D6-9855-00508BB3C376 ak_test_all_db 11/15/98 3:10 NT\TEST 1000
36D539E2-7DE3-11D6-9855-00508BB3C376 ak_test_sys_db 11/16/98 3:10 NT\TEST 1000
36D539E3-7DE3-11D6-9855-00508BB3C376 ak_test_user_db (tng) 11/17/98 3:10 NT\TEST 1000
  • sysdbmaintplan_history: Maintain the history information for each maintenance plan.

  • sysdbmaintplan_jobs: Maintains the relationship between the maintenance plan id and the job id.


Comments on These System Tables:

Notice than there is one predefined maintenance plan named: "All ad-hoc plans" with a strange owner: "REDMOND\_sqlbld". It is used for all ad-hoc jobs using the xp_sqlmaint utility. The max_history_rows for this plan is set to 0, however there are history entries in the sysdbmaintplan_history table for it.

To demonstrate how this "special" entries works, I created a custom job with following command:

EXECUTE master.dbo.xp_sqlmaint N'-D WWW_ak -Rpt "e:\mssql7\LOG\www_ak.txt" -WriteHistory -CkDB '

After running it twice, here's what the history table looks like:

plan_id plan
_name
database
_name
server
_name
activity duration
00000000-0000-0000-0000-000000000000 All ad-hoc plans WWW_ak test Check Data and Index Linkage 77
00000000-0000-0000-0000-000000000000 All ad-hoc plans WWW_ak test Check Data and Index Linkage 77

 (tng)

Creating a Custom Maintenance Plan

As you can see, the SQL Server Database Maintenance Plan Wizard doesn’t allow us to include all the potentially useful options (HTML report, some DBCC stuff). As workaround, I propose that you follow one these two options when creating your own maintenance plan:

  1. Create each new maintenance plan using the wizard, then modify each job manually for those options not available directly from the wizard.

  2. Avoid the wizard completely, and create all jobs manually using the xp_sqlmaint utility.

I recommend the following strategy for SQL Server maintenance jobs:

  1. Create jobs (ad-hoc or using the wizard) for full backups of your databases with DBCC CHECKDB and CHECKCATALOG, and set up the option to perform the backup only if they didn’t report any errors. Create this job for all databases which don’t demand transaction log backups.

  2. Create separate jobs for only transaction log backups for all databases which need it.

  3. Create separate job(s) for data optimizations, depending on your demands.

  4. For all of your jobs, add the HTML report option and direct it to a share point for easy access with a browser.

All information in this article was provided to help you simplify the management of our SQL Server environment. Please send all comments and questions to: akozlowski@amadeus.net





]]>
如何数据库收~日志文?/title><link>http://www.tkk7.com/xine/articles/49644.html</link><dc:creator>【Xine】中文站</dc:creator><author>【Xine】中文站</author><pubDate>Thu, 01 Jun 2006 07:51:00 GMT</pubDate><guid>http://www.tkk7.com/xine/articles/49644.html</guid><wfw:comment>http://www.tkk7.com/xine/comments/49644.html</wfw:comment><comments>http://www.tkk7.com/xine/articles/49644.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/xine/comments/commentRss/49644.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/xine/services/trackbacks/49644.html</trackback:ping><description><![CDATA[ <p> <font size="2">我有个数据库statmemberdata现在的日志文仉辑ֈ40G?jin),我要用DBCC SHRINKDATABASE来收~这个日志,q程如下Q?br />1、重新启动数据服务器Q通过q程控制软gq行的)(j)<br />2、在q程通过SQL SERVER的查询分析器中连接到数据服务?br />3、远E控制数据服务器服务暂停<br />4、过十分钟,在远E查询分析器中执行:(x)<br /> (tng) (tng) DBCC SHRINKDATABASE (statmemberdata)<br /> (tng) (tng) q了(jin)几分钟出C下错误:(x)<br /> (tng) (tng) “无法收~日志文?2Qstatmemberdata_logQ,因ؓ(f)所有的逻辑日志文g都在使用?br /><br />Q所影响的行Cؓ(f) 2 行)(j)<br /><br />DBCC 执行完毕。如?DBCC 输出?jin)错误信息,请与pȝ理员联pR?br /><br />我不明白?jin),我都重新启动了(jin)数据服务器Q启动完后马上有暂停?jin)sql server的服务,然后又过?jin)一D|间才q行DBCC SHRINKDATABASE的,怎么老是说“所有的逻辑日志文g都在使用”呢Q都试过好多ơ了(jin)Q都是这栗?br /><br /><font color="#ff0000">----------------------------------------------------------------------------------------------------------------</font><br /><br />1: 删除LOG<br />1Q分L据库 (tng) (tng) 企业理器-Q服务器Q>数据库-Q右键-Q分L据库<br />2Q删除LOG文g<br />3Q附加数据库 (tng) 企业理器-Q服务器Q>数据库-Q右键-Q附加数据库<br />此法生成新的LOGQ大只?00多K<br /> (tng) (tng) 再将此数据库讄自动收羃<br />或用代码Q?<br />下面的示例分?pubsQ然后将 pubs 中的一个文仉加到当前服务器?br /><br /><font color="#ff0000">EXEC sp_detach_db @dbname = 'pubs'<br />EXEC sp_attach_single_file_db @dbname = 'pubs', <br /> (tng) (tng) @physname = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf'</font><br /><br /><br />2:清空日志<br />DUMP (tng) TRANSACTION (tng) 库名 (tng) WITH (tng) NO_LOG (tng) (tng) (tng) <br /><br />再:(x)<br />企业理?-右键你要压羃的数据库--所有Q?-收羃数据?-收羃文g--选择日志文g--在收~方式里选择收羃至XXM,q里?x)给Z个允许收~到的最M?直接输入q个?定可以了(jin)<br /><br />3: 如果想以后不让它增长<br />企业理器-Q服务器Q>数据库-Q属性-Q事务日志-Q将文g增长限制?M<br /><br /></font> </p> <pre> <font size="2">--压羃日志 1:截断事务日志Q? BACKUP LOG 数据库名 WITH NO_LOG 2:清空日志 DUMP TRANSACTION 库名 WITH NO_LOG 再:(x) 企业理?-右键你要压羃的数据库--所有Q?-收羃数据?-收羃文g--选择日志文g--在收~方式里选择收羃至XXM,q里?x)给Z个允许收~到的最M?直接输入q个?定可以了(jin) 3: 删除LOG 1Q分L据库 企业理器-Q服务器Q>数据库-Q右键-Q分L据库 2Q删除LOG文g 3Q附加数据库 企业理器-Q服务器Q>数据库-Q右键-Q附加数据库 此法生成新的LOGQ大只?00多K 再将此数据库讄自动收羃 或用代码Q? 下面的示例分?pubsQ然后将 pubs 中的一个文仉加到当前服务器? <font color="#ff0000">EXEC sp_detach_db @dbname = 'pubs' EXEC sp_attach_single_file_db @dbname = 'pubs', @physname = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf'</font><br /><br /><br /><br /></font> </pre> <pre> <font size="2">对于有两个库文g的数据库L(fng)下面的语句:(x)<br /><br /><font color="#ff0000">exec sp_attach_db @dbname = 'pubs',<br /> (tng)@filename1 = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf',<br /> (tng)@filename2 = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs1_Data.NDF'</font><br /><br /></font> </pre> <pre> <font size="2">如果数据库有两个日志文gQ则以上Ҏ(gu)׃行了(jin)?br />需要删掉其中一个日志文ӞҎ(gu)如下Q?br /><font color="#ff0000">截断事务日志Q? BACKUP LOG otsp WITH NO_LOG 清空日志 DUMP TRANSACTION otsp WITH NO_LOG  (tng) (tng) <br />删除LOG文g 企业理器-Q服务器Q>数据库-Q右键-Q属性-Q日志文ӞQ选择W二个日志文件删除-Q确?br /><br />再按上面说的删除日志的方法去附加数据库,成功了(jin)</font></font> </pre>4: 如果想以后不让它增长企业理?-服务?-右键数据?-属?-事务日志--文件增镉K制ؓ(f)xM(x是你允许的最大数据文件大? --SQL语句的设|方?alter database 数据库名 modify file(name=逻辑文g?maxsize=20)5.讄动收~企业管理器--服务?-右键数据?-属?-选项--选择"自动收羃"<pre><font size="2">--q(sh)?关闭用h开的进E处?在查询分析器中执行下面的语句 use master go if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_killspid]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure [dbo].[p_killspid] GO create proc p_killspid @dbname varchar(200) --要关闭进E的数据库名 as declare @sql nvarchar(500) declare @spid nvarchar(20) declare #tb cursor for select spid=cast(spid as varchar(20)) from master..sysprocesses where dbid=db_id(@dbname) open #tb fetch next from #tb into @spid while @@fetch_status=0 begin exec('kill '+@spid) fetch next from #tb into @spid end close #tb deallocate #tb go --用法 exec p_killspid 'statmemberdata' go DBCC SHRINKDATABASE (statmemberdata) go drop proc p_killspid <br /><br /><br /><br /><br /><br /><p><br /><br /><br /><br />删除数据文g</p><p>dbcc shrinkfile (db_data2 , emptyfile)<br />alter database db<br />remove file db_data2<br />go<br /><br /><br /><br /><br /><br /><br /><br /></p></font></pre><pre><br /><br /><br /><font size="2">参考链接:(x)<br /><a >http://support.microsoft.com/?kbid=814579</a><br /></font><a >http://www.experts-exchange.com/Databases/Microsoft_SQL_Server/Q_21090815.html</a><br /><a >http://support.microsoft.com/default.aspx?scid=kb;zh-cn;317375</a><br /><a >http://www.weste.net/html/200409/20040904QBI110037.html</a><br /><a >http://www.knowsky.com/18746.html</a><br /><p> (tng)</p><br /><br /><br /><br /><br /><br /></pre><img src ="http://www.tkk7.com/xine/aggbug/49644.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/xine/" target="_blank">【Xine】中文站</a> 2006-06-01 15:51 <a href="http://www.tkk7.com/xine/articles/49644.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正确配置和用SQL mailhttp://www.tkk7.com/xine/articles/49643.html【Xine】中文站【Xine】中文站Thu, 01 Jun 2006 07:50:00 GMThttp://www.tkk7.com/xine/articles/49643.htmlhttp://www.tkk7.com/xine/comments/49643.htmlhttp://www.tkk7.com/xine/articles/49643.html#Feedback0http://www.tkk7.com/xine/comments/commentRss/49643.htmlhttp://www.tkk7.com/xine/services/trackbacks/49643.html  
  我用SQL mail主要是要完成q样的功能:(x)
  >用户在网上注册后,pȝ随Z生的密码发送到用户登记的Email
  >用户在论坛的帖子有回复时内容发送到用户的Email
  因ؓ(f)上述q程都是在存储过E中完成的,所以避免了(jin)前台E序对参数的
  传输处理Q也不需要再用第三方的组件完成,感觉比较方便?br />  
  1.Z(jin)使用SQL mail,首先你的服务器上得有SMTP服务Q我没有安装win2000 server自带的SMTPQ而是用imail6.04的SMTP,感觉比较E_Q功能也比较强?br />  2.安装一个邮件系l?我安装了(jin)outLook 2000Q我发现在配|邮件profileӞ如果
  不安装outLook而是用别的第三方E序Qwin2k中文server版在控制面板中就找不到“邮件”一?
  3.安装完outlook后再h控制面板,׃(x)扑ֈ“邮件”一,双击q行邮g的配|,为配|文件v一个名?假设为myProfile)Q以便以后SQL mail使用Q在该配|文件中讄各项属性?br />  4.启动outlook(讄为用myProfile作ؓ(f)默认的配|文?,试q行收发邮gQ确认outlook工作正常?br />  5.用当前的域帐户启动SQL server,在企业管理器的支持服务中Q点击SQL mail的属性,可以看到在配|文仉择中,出现?jin)刚才定义的myProfile配置文g(你也可以定义多个profile)Q选择q个配置文gq行试QSQL返回成功开始和l束一个MAPI?x)话的信息,如果出现错误或是没有扑ֈ邮g配置文gQ那一定是你启动SQL server用的帐号有问?br />  6.现在你就可以在查询分析器中用XP_sendmailq个扩展存储q程发送SQL mail?jin),格式如下Q?br />  xp_sendmail {[@recipients =] 'recipients [;...n]'}
  [,][@message =] 'message']
  [,][@query =] 'query']
  [,][@attachments =] attachments]
  [,][@copy_recipients =] 'copy_recipients [;...n]'
  [,][@blind_copy_recipients =] 'blind_copy_recipients [;...n]'
  [,][@subject =] 'subject']
  [,[@type =] 'type']
  [,][@attach_results =] 'attach_value']
  [,][@no_output =] 'output_value']
  [,][@no_header =] 'header_value']
  [,][@width =] width]
  [,][@separator =] 'separator']
  [,][@echo_error =] 'echo_value']
  [,][@set_user =] 'user']
  [,][@dbuse =] 'database']
  
  其中@recipients是必需?br />  
  参数说明Q?br />  
  参数 说明
  @recipients 收g人,中间用逗号分开
  @message 要发送的信息
  @query 定执行q依附邮件的有效查询Q除触发器中的插入表?qing)删除表外,此查询能引用M对象
  @attachments 附g
  @copy_recipients 抄?
  @blind_copy_recipients 密?
  @subject 标题
  @attach_results 指定查询l果做ؓ(f)附g发?
  @no_header 不发送查询结果的列名
  @set_user 查询联接的用户名Q默认ؓ(f)Guset
  @dbuse 查询所用的数据库,默认为缺省数据库
  
  
  7.不过Q如果是在web应用中用SQL mail,q有一些问题要解决:首先Q就是应用程序中q接数据库的帐号Q我在网站程序中的数据库q接是用UDL文gQ帐号ؓ(f)DbGuest,q是一个普通帐P所以还必须在master库的扩展存储q程扑ֈXP_sendmailQƈ在其属性中增加DbGuestq个用户Qƈ选择EXEC权限?br />  好了(jin)Q现在设|完毕,q行|站E序Q测试用h册,几乎没有什么gq,我测试用的邮׃收C(jin)q封SQL mail发出的Email:
  "谢谢你的注册Q你的用户名?[?j)歌],密码?123456789,你首ơ登录后修改密码"
  
  大功告成!看v来很单的q程Q却折腾?jin)我一个星?希望你能比我利.
  
  不过Q现在虽然能用SQLmail发送附Ӟ附加数据库查询结果,但是我还没有发现有什么办法用SQLmail发送html格式的邮Ӟ如果你知道,请一定告诉我?

]]>
SQLMail的原理及(qing)实际应用http://www.tkk7.com/xine/articles/49637.html【Xine】中文站【Xine】中文站Thu, 01 Jun 2006 07:45:00 GMThttp://www.tkk7.com/xine/articles/49637.htmlhttp://www.tkk7.com/xine/comments/49637.htmlhttp://www.tkk7.com/xine/articles/49637.html#Feedback0http://www.tkk7.com/xine/comments/commentRss/49637.htmlhttp://www.tkk7.com/xine/services/trackbacks/49637.html  
  ----q里所指的SQLMailQ是微Y公司的关pL据库理pȝ SQLServer所提供的邮件功能。在SQLServer中包含一些扩展存储过E,使得SQLServer可以通过ZWindowsNT内部的消息应用编E界面(MAPIQ的客户机邮件程序接收和发送邮件消息。SQLMail可发送的消息包括文本Ԍ附加文g或SQL语句的执行结果集。应用SQLMail的扩展存储过E,邮g消息可以从一个触?br />  器或一个存储过E中发送,q且通过SQLServer提供的Q务和警告{功能,可以Ҏ(gu)需要在不同的时间和情况下发送?br />  
  ----SQLMail工作程
  
  ----SQLMail工作程主要分ؓ(f)邮g收、发两个q程?br />  
  ----在SQLServer内可以通过一定方法,调用扩展存储q程xp_s
  endmailQ将收信人电(sh)子邮件地址Q标题,信的内容{以参数的Ş式传送给xp_sendmailQ由它通过客户端MAPI接口发送邮件Q
  务交l如MicrosoftExchangeClient或Outlook97{邮件客L(fng)E序Q最l通过邮g服务邮件发送出厅R?br />  
  ----攉件的q程与此怼。在SQLServer端定期或手工调用xp_readmail扩展存储q程Q通过客户端MAPI接口存攑֜邮g服务器或客户端的邮g?qing)其他信息读入SQL变量中,用来满特定的处理需要?
  配置SQLMail
  
  ----配置SQLMail的首要条件是要有一个电(sh)子邮件帐P不管是局域网内的MSExchangeServer或MSMail3.x的邮件帐Pq是Internet上的SMTPQPOP3{邮件帐户均可。具体配|可分ؓ(f)以下几步Q?br />  
  ----1Qؓ(f)SQLServer创徏一个NT域用户帐P要求h本地理员组的权限。仔l设|帐号口令,保证口o(h)_复杂Q且设成口o(h)怸q期和用户不得更改口令?br />  
  ----2Q双?yn)L刉板的服务图标Q找到MSSQLServer的启动设|,UseSystemAccount改ؓ(f)UseThisAccountQ将刚才建立的NT帐号和口令输入。重新启动SQLServer?br />  
  ----3Q在安装SQLServer的服务器上以与启动SQLServer相同的NT帐号dQ然后安装支持MAPI接口的邮件客L(fng)E序Q如MS
  ExchangeClient和Outlook97?br />  
  ----4Q打开控制面板的电(sh)子邮仉项Q徏立一个配|文ӞProfileQ。用q个配置文g启动邮g客户端程序,反复(g)验直臌正常收发邮g?br />  
  ----5Q从SqlEnterpriserManager中,点中相应的服务器图标Q从
  Server菜单中选SQLMail/ConfigureQ将在第4步中建立的配|文件名输入?br />  
  ----6Q从SqlEnterpriserManager中,点中相应的服务器图标Q从
  Server菜单中选SQLMail/StartQ如果SqlMail的图标变?sh)绿Ԍ则SQ
  LMail成功启动?br />  
  ----常用的SQLMail扩展存储q程
  
  xp_sendmail@recipient=recipient
  
  [;recipient2;[...;recipientn]]
  
  [,@message=message]
  
  [,@query=query]
  
  [,@attachments=attachments]
  
  [,@copy_recipients=recipient
  
  [;recipient2;[...;recipientn]]]
  
  [,@blind_copy_recipients=recipient
  
  [;recipient2;[...;recipientn]]]
  
  [,@subject=subject]
  
  [,@type=type]
  
  [,@attach_results={'true'|'false'}]
  
  [,@no_output={'true'|'false'}]
  
  [,@no_header={'true'|'false'}]
  
  [,@width=width]
  
  [,@separator=separator]
  
  [,@echo_error={'true'|'false'}]
  
  [,@set_user=user]
  
  [,@dbuse=dbname]
  
  ----此存储过E通过客户端MAPI接口发送邮Ӟ内容可以是文本串Q附加文件或SQL语句的执行结果集?br />  
  xp_findnextmsg[@msg_id=msg_id[OUTPUT]]
  
  [,@type=type]
  
  [,@unread_only={'true'|'false'}])
  
  ----此存储过E在邮箱中查扄定的邮gQƈq回一邮件的消息ID?br />  
  xp_readmail([@msg_id=msg_id][,@type=type[OUTPUT]]
  
  [,@peek={'true'|'false'}]
  
  [,@suppress_attach={'true'|'false'}]
  
  [,@originator=@senderOUTPUT]
  
  [,@subject=@subject_lineOUTPUT]
  
  [,@message=@body_of_messageOUTPUT]
  
  [,@recipients=@recipient_listOUTPUT]
  
  [,@cc_list=@cc_listOUTPUT]
  
  [,@bcc_list=@bcc_listOUTPUT]
  
  [,@date_received=@dateOUTPUT]
  
  [,@unread={'true'|'false'}]
  
  [,@attachments=@temp_file_pathsOUTPUT])
  
  [,@skip_bytes=@bytes_toskipOUTPUT]
  
  [,@msg_length=@length_in_bytesOUTPUT])
  
  ----此存储过E从指定的邮件收件箱中读取指定消息ID的邮件的各项信息?br />  
  ----xp_deletemail[@msg_id=]msg_id
  
  ----从邮件收件箱中删除一指定消息ID的邮件?br />  
  ----注释Q?br />  
  ----1.存储q程的多个参数间用逗号间隔开Q[]内的为可选参敎ͼ每个参数均以@W号加字W串开_(d)用以区别不同的参数项。等号后可以是常量,也可以是预先定义好的变量?br />  
  ----2.如果需要将某个l果D予参C预先定义好的变量Q就必须在该参数的最后加OUTPUT?br />  
  ----3.常用参数解释Q?br />  
  ----?@recipient=recipientQ指定收件h的电(sh)子邮件地址。如果有多个收g人,可以用分号分隔开?br />  
  ----?@subject=subjectQ邮件的标题。发送邮件时的默认gؓ(f)
  "SQLServerMessage"?br />  
  ----?@message=messageQ邮件的具体内容?br />  
  ----?@attachments=attachmentsQ邮件挂接的附加文g名?br />  
  ----?@type=typeQ基于MAPI定义的消息类型,详细信息参见"
  MicrosoftWindowsNTResourceKit"?MicrosoftMailTechnicalReference"?br />  
  ----?@query=queryQ一条SQL可执行语句,其执行结果以正文或附件的方式随邮件发送?br />  
  ----?@msg_id=msg_idQ对于信׃的每一邮件均被分配了(jin)
  
  ----?@attachments=attachmentsQ邮件挂接的附加文g名?br />  
  ----?@type=typeQ基于MAPI定义的消息类型,详细信息参见"
  MicrosoftWindowsNTResourceKit"?MicrosoftMailTechnicalReference"?br />  
  ----?@query=queryQ一条SQL可执行语句,其执行结果以正文或附件的方式随邮件发送?br />  
  ----?@msg_id=msg_idQ对于信׃的每一邮件均被分配了(jin)一个特D的消息IDQ用以相互区分?br />  
  ----?@originator=@senderQ读取特定邮件的发送者的邮g地址?br />  
  --ZSQLMail的电(sh)子报刊自动处理系l?br />  
  ----q里利用SQLMail单的实现?jin)一个电(sh)子报刊自动处理系l。每当新的一期电(sh)子报刊编辑完成,只需单追加到发行数据库publication中,SQLServer?x)自动定期执行my_publish存储q程。在my_publish存储q程中,它检查发行数据库Q当发现有新的记录(x(chng)的一期电(sh)子报刊)(j)Ӟ通过逐个从订阅数据库sub_info中取?gu)阅h的邮件地址Q完成给每个订阅者发送电(sh)子报刊(以邮件Ş式)(j)的Q务?br />  
  ----?sh)子报刊的订阅与取消也是通过邮g来实现。SQLServer同样定期执行my_subscibe存储q程。my_subscibe存储q程(g)查特?br />  邮箱中的所有邮Ӟ如果存在标题?sh)?subscribe"的邮Ӟ取出它的发件h{信息,在订阅数据库中添加一条记录;同样Q如果存在标题(sh)ؓ(f)"stopsubscribe"的邮Ӟ将它的相关记录从订阅数据库中删除。系l中用到的数据库和存储过E如下所
  C。sub_infoQ订阅者信息数据库Q?字段名称cd允许I值含?br />  
  emailvarchar(20)NOTNULL订阅者电(sh)子邮件地址
  sub_datedatetimeNOTNULL订阅旉
  
  othertextNULL订阅者的其他信息
  
  publicationQ电(sh)子报刊出版数据库Q?br />  
  字段名称cd允许I值含?br />  
  pub_classchar(10)NOTNULL?sh)子报刊期?br />  
  pub_datedatetimeNULL出版日期
  
  titletextNOTNULL本期?sh)子报刊标?br />  
  contenttextNOTNULL?sh)子报刊正?br />  
  endnotetextNULL附加于报刊的其他信息
  
  flagsmallintNULL1Q标志ؓ(f)未出版的新报?br />  
  my_subscribeQ用于处理订阅者信息的存储q程?br />  
  CREATEPROCEDUREmy_subscribe
  
  AS
  
  declare@msg_idvarchar(64)
  
  declare@subjectvarchar(255)
  
  declare@messagevarchar(255)
  
  declare@originatorvarchar(255)
  
  declare@datevarchar(255)
  
  declare@statusint
  
  declare@mapifailureint
  
  select@mapifailure=0
  
  
  while(1=1)
  
  begin
  
  /*查找邮gq获取消息ID*/
  
  exec@status=master..
  
  xp_findnextmsg@msg_id=@msg_idOUTPUT
  
  if@status<>0
  
  begin
  
  select@mapifailure=1
  
  break
  
  end
  
  if@msg_idisnullbreak
  
  /*d邮g的信息到变量?/
  
  exec@status=master..xp_readmail
  
  @msg_id=@msg_id,
  
  @originator=@originatorOUTPUT,
  
  @subject=@subjectOUTPUT,
  
  @message=@messageOUTPUT,
  
  @date_received=@dateOUTPUT
  
  if@status<>0
  
  begin
  
  select@mapifailure=1
  
  break
  
  end
  
  /*Ҏ(gu)邮g标题Q在订阅数据库中d或删除记?/
  
  execxp_deletemail@msg_id=@msg_id
  
  if@subject='subscribe'
  
  insertintosqlmailsample..
  
  sub_infovalues(@originator,@date,@message)
  
  else
  
  if@subject='stopsubscribe'
  
  deletefromsqlmailsample..sub_infowhereemail=@originator
  
  end/*循环l束*/
  
  
  if@mapifailure=1
  
  /*错误处理代码*/
  
  else
  
  return(0)
  
  GO
  
  
  my_publishQ用于分发电(sh)子报刊的存储q程?br />  
  CREATEPROCEDUREmy_publish
  
  AS
  
  declare@recipientvarchar(255)
  
  declare@subjectvarchar(255)
  
  declare@contentvarchar(255)
  
  declare@endnotevarchar(255)
  
  declare@statusint
  
  
  select@subject=pub_classfrom
  
  sqlmailsample..publicationwhereflag=1
  
  /*如果有新的电(sh)子报刊,则开始分?/
  
  if(@subjectisnotnull)
  
  begin
  
  /*数据库记录取出Q经q适当处理后,存放到变量中*/
  
  select@subject=convert(varchar
  
  (255),title)+'('+pub_class+')',
  
  @content=convert(varchar(255),content)
  
  +convert(varchar(255),endnote)
  
  fromsqlmailsample..publication
  
  whereflag=1
  
  updatesqlmailsample..publication
  
  setflag=0whereflag=1
  
  
  declarecurcursorforselect
  
  emailfromsqlmailsample..sub_info
  
  opencur
  
  fetchcur
  
  while(@@fetch_status=0)
  
  begin
  
  /*取收件h的电(sh)子邮件地址*/
  
  fetchnextfromcurinto@recipient
  
  /*发送电(sh)子邮?/
  
  if@@fetch_status=0
  
  begin
  
  exec@status=master..xp_sendmail
  
  @recipients=@recipient,
  
  @message=@content,
  
  @subject=@subject
  
  if@status<>0
  
  /*错误处理代码*/
  
  end
  
  end/*向所有订阅h发送电(sh)子报刊的循环l束*/
  
  closecur
  
  deallocatecur
  
  end
  
  GO
  
  ----MQSQLMail在数据库和电(sh)子邮件之间架起了(jin)一座沟?br />  
  end/*向所有订阅h发送电(sh)子报刊的循环l束*/
  
  closecur
  
  deallocatecur
  
  end
  
  GO
  
  ----MQSQLMail在数据库和电(sh)子邮件之间架起了(jin)一座沟通的桥梁Qؓ(f)某些特定用途的应用提供?jin)简单高效的解决Ҏ(gu)Q值得一?img src ="http://www.tkk7.com/xine/aggbug/49637.html" width = "1" height = "1" />

]]>
վ֩ģ壺 þ㽶߿ۿƬ| ƵС˵ͼƬ| AV߹ۿ| ˾ƷƵ99߹ۿ| ҹһƵ| ٸĻӰ| ˬˬƬA | ѹۿëƬaƬ2008| ҹþþþüŮӰԺ| AVƷһ| ĻƵ| ߹ۿҹһ| avһ| 2021ھƷþþþþ| ߾ƷһӰȷ | ƷƵۿ| ߲ѲavƬ| ޳avƬ| ߹͵Ʒѿ| 18վѹۿ| ޾Ʒ͵Բ| ƷվƵ| ɫĻAV| ĻӰӾþþѹۿ| պػɫƬƵ| ޾߹ۿ| 9277ֻƵۿ| ¶ۺɫ| һëƬaaaaaaƵѿ| ĻӰԺ| ޾Ʒþ| ˻ҳվѹۿȫ| ޹Ʒ˾ƷС˵| պƷһůů| ޾AA߹ۿSEE| ƷƵȫѹۿ| ޹Ʒ߲| ؼëƬȫѲaһ| ѹۿվ| ˳ɫ777777Ʒ| ëƬѹۿƵ|