【SQL Server學習筆記】數據庫的創建、設置、空間管理


1、數據庫基礎

[sql]  view plain  copy
 
  1. --1.建庫  
  2. create database wc  
  3. on primary  
  4. name = wc_data,  
  5.   filename ='d:\wc_data.mdf',  
  6.   size =3MB,  
  7.   maxsize = unlimited,  
  8.   filegrowth = 1MB),  
  9.     
  10. filegroup wc_fg1  
  11. name = wc_fg1,  
  12.   filename ='d:\wc_fg1.ndf',  
  13.   size =3MB,  
  14.   maxsize =1GB,  
  15.   filegrowth = 100KB),  
  16.     
  17. filegroup wc_fg2  
  18. name = wc_fg2,  
  19.   filename ='d:\wc_fg2.ndf',  
  20.   size =3MB,  
  21.   maxsize = 100MB,  
  22.   filegrowth = 1MB)  
  23.     
  24. LOG on  
  25. name = wc_log,  
  26.   filename = 'd:\wc_log.ldf',  
  27.   size =3MB,  
  28.   maxsize = 200MB,  
  29.   filegrowth = 20%  
  30. )  
  31.   
  32. --2.1數據庫屬性  
  33. select * from sys.databases  
  34.   
  35.   
  36. --2.2數據庫大小、屬性、兼容級別,文件屬性  
  37. exec sp_helpdb 'wc'  
  38.   
  39. --3.1只允許一個用戶訪問數據庫  
  40. alter database wc  
  41. set single_user   
  42. with rollback after 10 seconds --指定多少秒后回滾事務  
  43.   
  44. --3.2只有sysadmin,dbcreator,db_owner角色的成員可以訪問數據庫  
  45. alter database wc  
  46. set restricted_user   
  47. with rollback immediate    --立即回滾事務  
  48.   
  49. --3.3不等待立即改變用戶訪問,如不能立即完成,那么會導致執行錯誤  
  50. alter database wc  
  51. set multi_user  
  52. with no_wait     
  53.   
  54.   
  55. --4.1改為單用戶模式  
  56. alter database wc  
  57. set single_user  
  58. with rollback immediate  
  59.   
  60. --4.2刪除數據庫,無法刪除數據庫 "wc",因為該數據庫當前正在使用。  
  61. drop database wc  
  62.   
  63.   
  64. --5.1分離數據庫  
  65. use master  
  66. go  
  67.   
  68. alter database wc  
  69. set single_user  
  70. with rollback immediate  
  71.   
  72. exec sp_detach_db   
  73.     @dbname ='wc',  
  74.     @skipchecks = 'true' --true:在分離數據庫前不會更新統計信息  
  75.                          --false:會更新統計信息,默認選項  
  76.   
  77. --5.2.1附加數據庫:第一種方法,將在后續版本中刪除該功能  
  78. exec sp_attach_db   
  79.     @dbname ='wc',  
  80.     @filename1 = 'd:\wc_data.mdf' --最多指定16個文件名  
  81.       
  82. --5.2.2附加數據庫:第二種方法  
  83. create database wc  
  84. on (name = wc_data,  
  85.     filename = 'd:\wc_data.mdf')  
  86. for attach    
  87.   
  88. create database wc  
  89. on (name = wc_data,  
  90.     filename = 'd:\wc_data.mdf')  
  91. for attach_rebuild_log   --附加的同時重建日志文件  
  92.                      `  
  93.                            
  94. --6.1數據庫重命名  
  95. ALTER DATABASE WC  
  96. MODIFY NAME = WC_NEW  
  97.   
  98. --6.2刪除數據庫  
  99. DROP DATABASE WC_NEW  

 

2、數據庫選項

[sql]  view plain  copy
 
  1. --1.1.1只允許一個用戶訪問數據庫  
  2. alter database wc  
  3. set single_user   
  4. with rollback after 10 seconds --指定多少秒后回滾事務  
  5.   
  6.   
  7. --1.1.2只有sysadmin,dbcreator,db_owner角色的成員可以訪問數據庫  
  8. alter database wc  
  9. set restricted_user   
  10. with rollback immediate    --立即回滾事務  
  11.   
  12.   
  13. --1.1.3不等待立即改變用戶訪問,如不能立即完成,那么會導致執行錯誤  
  14. alter database wc  
  15. set multi_user  
  16. with no_wait  
  17.   
  18.   
  19. --1.2.1設置數據庫為在線狀態  
  20. ALTER DATABASE WC  
  21. SET ONLINE  
  22.   
  23. --1.2.2設置數據庫為脫機狀態  
  24. ALTER DATABASE WC  
  25. SET OFFLINE  
  26.   
  27. --1.2.3設置數據庫為緊急狀態  
  28. --如果數據庫損壞,將數據庫置為緊急狀態可以允許sysadmin服務器角色到數據庫的只讀訪問  
  29. ALTER DATABASE WC  
  30. SET EMERGENCY    
  31.   
  32.   
  33. --1.3.1數據庫只讀  
  34. ALTER DATABASE WC  
  35. SET READ_ONLY  
  36.   
  37. --1.3.2數據庫可讀寫  
  38. ALTER DATABASE WC  
  39. SET RAD_WRITE   
  40.   
  41.   
  42.   
  43. --2.配置自動選項  
  44. --2.1當數據庫還有最后一個用戶連接且所有操作已經完成,會關閉數據庫且釋放資源  
  45. alter database wc  
  46. SET AUTO_CLOSE OFF  
  47.   
  48. --2.2自動生成關於列中值的分布的統計信息  
  49. ALTER DATABASE WC  
  50. SET AUTO_CREATE_STATISTICS ON  
  51.   
  52. --2.3自動更新已經為表創建的統計信息  
  53. ALTER DATABASE WC  
  54. SET AUTO_UPDATE_STATISTICS ON  
  55.   
  56. --2.4當統計信息過期時,查詢在編譯前不會等待統計信息的更新  
  57. ALTER DATABASE WC  
  58. SET AUTO_UPDATE_STATISTICS_ASYNC OFF  
  59.   
  60. --2.5當文件的未使用空間超過25%時自動收縮數據和日志文件  
  61. --不過收縮后的文件,不小於文件創建時的大小  
  62. ALTER DATABASE WC  
  63. SET AUTO_SHRINK OFF  
  64.   
  65.   
  66. --ANSI SQL選項  
  67. --3.1設置為ON:指定未顯式定義列為NULL  
  68. --默認為OFF:列定義為NOT NULL  
  69. ALTER DATABASE WC  
  70. SET ANSI_NULL_DEFAULT OFF  
  71.   
  72. --3.2設置為ON:與NULL的值的比較將返回UNKNOWN  
  73. --默認為OFF:兩個NULL比較返回TRUE  
  74. ALTER DATABASE WC  
  75. SET ANSI_NULLS OFF  
  76.   
  77. --3.3設置為ON:字符串與NULL連接會返回NULL  
  78. --默認為OFF:會把NULL當成空串  
  79. ALTER DATABASE WC  
  80. SET CONCAT_NULL_YIELDS_NULL OFF  
  81.   
  82. --3.4設為ON:對varchar或nvarchar字符串填充到相同的長度  
  83. --默認為OFF:不會填充  
  84. ALTER DATABASE WC  
  85. SET ANSI_PADDING OFF  
  86.   
  87. --3.5設為ON:標識符可以用雙引號分隔,字符串可以用單引號分隔  
  88. --默認值是OFF  
  89. ALTER DATABASE WC  
  90. SET QUOTED_IDENTIFIER OFF  
  91.   
  92. --3.6設為ON:在聚合函數中使用任何NULL值、除數為0、算術溢出錯誤,會報錯  
  93. --默認OFF:不會報錯  
  94. ALTER DATABASE WC  
  95. SET ANSI_WARNINGS OFF  
  96.   
  97. --3.7當發生溢出、除數為0時查詢會報錯,事務被回滾  
  98. --默認OFF:不會報錯,只是引發警告  
  99. ALTER DATABASE WC  
  100. SET ARITHABORT OFF  
  101.   
  102. --3.8設置ON:表達式中有精度損失時會報錯,  
  103. --OFF:不會報錯,但會根據精度四舍五入  
  104. ALTER DATABASE WC  
  105. SET NUMERIC_ROUNDABORT OFF  
  106.   
  107. --3.9遞歸觸發器  
  108. ALTER DATABASE WC  
  109. SET RECURSIVE_TRIGGERS OFF  
  110.   
  111.   
  112. --4.1默認值為OFF,on表示在架構相同下,  
  113. --可以跨數據庫引用對象,不會檢查對象安全  
  114. ALTER DATABASE WC  
  115. SET DB_CHAINING ON  
  116.   
  117. --4.2默認值為OFF,  
  118. --on表示允許加載unsafe、external_access的CLR程序集  
  119. alter DATABASE WC  
  120. SET TRUSTWORTHY OFF  
  121.   
  122. --5.1數據庫的排序規則   
  123. CREATE DATABASE WCC  
  124. COLLATE UKRAINIAN_CI_AI  
  125.   
  126. --5.2修改排序規則  
  127. alter database wcc  
  128. collate Chinese_PRC_CI_AS  
  129.   
  130.   
  131. --6.1默認是OFF,ON表示在事務提交后自動關閉T-SQL游標  
  132. ALTER DATABASE WC  
  133. SET CURSOR_CLOSE_ON_COMMIT OFF  
  134.   
  135. --6.2設置為local表示創建的游標默認為本地訪問,global表示全局訪問  
  136. ALTER DATABASE WC  
  137. SET CURSOR_DEFAULT LOCAL  
  138.   
  139.   
  140.   
  141. --7.1啟用日期相關性優化時,SQL Server收集額外的統計信息  
  142. --當兩個表通過datetime類型的外鍵列的關聯時,有助於提高性能  
  143. ALTER DATABASE WC  
  144. SET DATE_CORRELATION_OPTIMIZATION OFF  
  145.   
  146. --7.2.1啟用快照隔離  
  147. ALTER DATABASE WC  
  148. SET ALLOW_SNAPSHOT_ISOLATION OFF  
  149.   
  150. --7.2.2啟用讀已提交快照  
  151. ALTER DATABASE WC  
  152. SET READ_COMMITTED_SNAPSHOT OFF  
  153.   
  154. --7.3數據庫參數化  
  155. --simple表示簡單參數化,  
  156. --forced表示增加查詢的參數化,使查詢計划可以重用,提升查詢性能  
  157. ALTER DATABASE WC  
  158. SET PARAMETERIZATION SIMPLE  
  159.   
  160.   
  161.   
  162. --8.1.1完全恢復  
  163. ALTER database WC  
  164. SET RECOVERY FULL  
  165.   
  166. --8.1.2大容量加載模式  
  167. ALTER database WC  
  168. SET RECOVERY BULK_LOGGED  
  169.   
  170. --8.1.3簡單恢復模式  
  171. ALTER database WC  
  172. SET RECOVERY SIMPLE  
  173.   
  174.   
  175. --8.2.1默認設置,基於整個數據頁的內容產生校驗和,寫入數據頁頭  
  176. ALTER DATABASE WC  
  177. SET PAGE_VERIFY CHECKSUM  
  178.   
  179. --8.2.2通過對每個數據頁的512字節扇區的反轉位,檢測數據頁問題  
  180. ALTER DATABASE WC  
  181. SET PAGE_VERIFY TORN_PAGE_DETECTION  
  182.   
  183. --8.2.3不采用任何校驗  
  184. ALTER DATABASE WC  
  185. SET PAGE_VERIFY NONE  

3、數據庫的擁有者

 

[sql]  view plain  copy
 
  1. create database wc  
  2.   
  3. use wc  
  4. go  
  5.   
  6. --創建登錄  
  7. create login newwc with password = 'newc'  
  8.   
  9. --改變數據庫的擁有者  
  10. exec sp_changedbowner  
  11.     @loginame = 'newwc'  
  12.       
  13. --查看數據庫的擁有者   
  14. select sp.name  
  15. from sys.databases d  
  16. inner join sys.server_principals sp  
  17.         on sp.sid = d.owner_sid   
  18. where d.name = 'wc'  

4、數據庫文件、文件組

 

 

 

 

[sql]  view plain  copy
 
  1. --1.1添加文件組  
  2. ALTER DATABASE WC  
  3. ADD FILEGROUP WC_FG8  
  4.   
  5.   
  6. --2.1添加數據文件  
  7. ALTER DATABASE WC  
  8. ADD FILE  
  9. (  
  10.     NAME = WC_FG8,  
  11.     FILENAME = 'D:\WC_FG8.ndf',  
  12.     SIZE = 1mb,  
  13.     MAXSIZE = 10mb,  
  14.     FILEGROWTH = 1mb  
  15. )  
  16. TO FILEGROUP WC_FG8  
  17.   
  18. --2.2添加日志文件  
  19. ALTER DATABASE WC  
  20. ADD LOG FILE  
  21. (  
  22.     NAME = WC_LOG3,  
  23.     FILENAME = 'D:\WC_FG3.LDF',  
  24.     SIZE = 1MB,  
  25.     MAXSIZE = 10MB,  
  26.     FILEGROWTH = 100KB  
  27. )  
  28.   
  29.   
  30. --3.1移動數據文件,由於在SQL Server中文件組,文件不能離線  
  31. --所以必須把整個數據庫設置為離線  
  32. ALTER DATABASE WC  
  33. SET OFFLINE  
  34.   
  35. ALTER DATABASE WC  
  36. MODIFY FILE  
  37. (  
  38.     NAME = WC_fg8,  
  39.     FILENAME = 'D:\WC\WC_FG8.NDF'  
  40. )  
  41.   
  42. ALTER DATABASE WC  
  43. SET ONLINE  
  44.   
  45.   
  46. --3.2修改數據文件的大小,增長大小,最大大小  
  47. ALTER DATABASE WC  
  48. MODIFY FILE  
  49. (  
  50.     NAME = 'WC_FG8',  
  51.     SIZE = 2MB,      --必須大於之前的大小,否則報錯  
  52.     MAXSIZE= 8MB,  
  53.     FILEGROWTH = 10%  
  54. )  
  55.   
  56. --3.3修改數據文件或日志文件的邏輯名稱  
  57. ALTER DATABASE WC  
  58. MODIFY FILE  
  59. (  
  60.     NAME = WC_LOG3,  
  61.     NEWNAME = WC_FG33  
  62. )  
  63.   
  64. --3.4刪除日志文件  
  65. ALTER DATABASE WC  
  66. REMOVE FILE WC_FG33  
  67.   
  68.   
  69. --3.5刪除數據文件  
  70. --把表新建在文件組wc_fg8上  
  71. CREATE TABLE T(NAME VARCHAr(1000))  
  72. on [wc_fg8]  
  73.   
  74. INSERT INTO T  
  75. SELECT NAME FROM SYS.objects  
  76.   
  77. /*===================================================  
  78. 1.要刪除數據文件,那么這個文件必須是空的  
  79. 2.那么通過shrinkfile來清空文件  
  80. 3.而要清空文件必須把文件的內容移到其他文件中  
  81. 4.所以又要確保wc_fg8文件組中還有其他的文件  
  82. 5.增加一個文件,這樣文件wc_fg8中的內容就會移動到新的文件中  
  83. =====================================================*/  
  84. ALTER DATABASE WC  
  85. ADD FILE  
  86. (  
  87.     NAME = 'WC_FG18',  
  88.     FILENAME = 'D:\WC_FG18.NDF',  
  89.     SIZE = 2MB,      --必須大於之前的大小,否則報錯  
  90.     MAXSIZE= 8MB,  
  91.     FILEGROWTH = 10%  
  92. )  
  93. TO FILEGROUP WC_FG8  
  94.   
  95. --清空wc_fg8文件的內容  
  96. DBCC SHRINKFILE(WC_FG8,EMPTYFILE)  
  97.   
  98. --移除文件,同時也在文件系統中刪除底層文件  
  99. ALTER DATABASE WC  
  100. REMOVE FILE WC_FG8  
  101.   
  102.   
  103.   
  104. --4.1設置默認文件組  
  105. ALTER DATABASE WC  
  106. MODIFY FILEGROUP WC_FG8 DEFAULT  
  107.   
  108. --4.2設為只讀文件組  
  109. --如果文件已經是某個屬性,不能再次設置相同屬性  
  110. ALTER DATABASE WC  
  111. MODIFY FILEGROUP WC_FG8 READ_WRITE  
  112.   
  113.   
  114. --4.3刪除文件組  
  115. --先必須刪除所有對象  
  116. DROP TABLE T  
  117.   
  118. --再刪除文件組中的所有文件  
  119. ALTER DATABASE WC  
  120. REMOVE FILE WC_FG88  
  121.   
  122. --最后刪除文件組  
  123. ALTER DATABASE WC  
  124. REMOVE FILEGROUP WC_FG8  

5、管理數據庫空間 

把數據雖然刪除了,但是這些被刪除的數據的空間,並沒有釋放,那么在查詢數據的時候,如果你的這個表一共占用了100頁的數據,如果采用表掃描,那么還是得掃描100,如果收縮了,也就是把數據都重新排列,去掉了很多空着的空間,那么可能就剩下30頁了,同樣掃描,只掃描30頁,就必然會快。

就像你看書資料一樣,有100頁的資料,然后你發現很多資料都沒用了,每一頁都有三分之二沒用的資料,划掉了,也就是一頁只有三分之一的資料是有用的。

這個時候,把這些資料,重新錄入一遍,從100頁減少到了33頁,那么你同樣看這么多的資料,所需要翻閱的頁數就少了很多,速度就自然快了。


收縮數據庫影響性能,是有2個方面:
1.在系統運行繁忙的時候,不要去收縮數據庫,因為這會阻塞其他的事務,導致這些操作變慢。

2.也沒有刪除數據,就直接收縮數據庫,這樣有可能把大量的空閑空間給收縮了,而你的情況有所不同,是因為你先刪除了數據,但是刪除數據后,這些空間,並沒有自動釋放,通過收縮數據庫,可以主動釋放這些被delete的數據占用的空間。

所以,是不一樣的。不過,雖然收縮數據庫后,查詢變快了,但確實不建議你去收縮數據庫。

因為收縮數據庫是一個全局的,會影響所有的表,而不是一個表,所以如果你在一個表中刪除了大量的數據,而你這個表又有聚集索引,那么可以通過rebuild 來重建這個表,這樣一樣能達到收縮的目的,而且不會影響其他的表 和整個數據庫。

[sql]  view plain  copy
 
  1. /*================================================  
  2. 顯示數據庫的空間使用情況:  
  3.   
  4. 1.DATABASE_SIZE = RESERVED + UNALLOCATED SPACE(還沒有分配) + 日志空間  
  5.   所以DATABASE_SIZE總是大於reserved + unallocated space之和  
  6.     
  7. 2.RESERVED = DATA + INDEX_SIZE + UNUSED(已經分配但還沒使用)  
  8.   
  9. 3.當delete或truncate一個大型對象后,sp_spaceused返回的值  
  10.   可能不正確,這時可以用@updatesuage='true'來更新統計信息,  
  11.   由於此操作可能會花費一些時間,所以只有確定這么做對其他進程沒有負面應影響時才使用.  
  12.   在刪除或重新生成大型索引時,或者在刪除或截斷大型表時,  
  13.   數據庫采用延遲操作,數據庫在事務提交后,才會釋放這些延遲操作所占資源。  
  14.   此外,延遲的刪除操作不會立即釋放已分配的空間,  
  15.   所以sp_spaceused不能准確顯示實際可用空間值.  
  16. ==================================================*/  
  17.   
  18. --顯示當前數據庫的空間使用情況  
  19. EXEC sp_spaceused  
  20.   
  21.   
  22. --顯示表的空間使用  
  23. exex sp_spaceused  
  24.     @objname = 'wcT',  
  25.     @updateusage = 'true'  
  26.   
  27.   
  28. --顯示整個服務器中所有數據庫的日志使用情況  
  29. DBCC SQLPERF(LOGSPACE)     
  30.   
  31.   
  32. --收縮數據庫  
  33. DBCC SHRINKDATABASE('WC',  --要收縮的數據庫名稱或數據庫ID  
  34.                     10     --收縮后,數據庫文件中空間空間占用的百分比  
  35.                     )  
  36.   
  37. DBCC SHRINKDATABASE('WC',  --要收縮的數據庫名稱或數據庫ID  
  38.                     10,    --收縮后,數據庫文件中空閑空間占用的百分比  
  39.                     NOTRUNCATE --在收縮時,通過數據移動來騰出自由空間  
  40.                     )  
  41.                       
  42. DBCC SHRINKDATABASE('WC',  --要收縮的數據庫名稱或數據庫ID  
  43.                     10,    --收縮后,數據庫文件中空間空間占用的百分比  
  44.               TRUNCATEONLY --在收縮時,只是把文件尾部的空閑空間釋放  
  45.                     )  
  46.                       
  47.   
  48. --收縮文件  
  49. DBCC SHRINKFILE(wc_fg8,   --要收縮的數據文件邏輯名稱  
  50.                 7         --要收縮的目標大小,以MB為單位  
  51.                 )  
  52.                   
  53. DBCC SHRINKFILE(wc_fg8,   --要收縮的數據文件邏輯名稱  
  54.                 EMPTYFILE --清空文件  
  55.                 )                            


 注意:這里特別需要注意,收縮文件時,特別是收縮日志文件時,收縮是否有效,決定於 日志的回復模式,如果是full模式,之前做過備份,那么收縮基本上是不會成功的,

所以需要先修改為simple模式,然后再收縮,在收縮后再修改為full模式,並做一次完全備份。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM