ผู้ดูแลฐานข้อมูล

ถามตอบสำหรับผู้เชี่ยวชาญด้านฐานข้อมูลที่ต้องการพัฒนาทักษะฐานข้อมูลและเรียนรู้จากผู้อื่นในชุมชน

1
ทำให้ข้อมูลเก่าเป็นแบบอ่านอย่างเดียว
ในโครงการฐานข้อมูลที่ฉันกำลังทำงานอยู่มีข้อกำหนดว่า ณ เวลาใดเวลาหนึ่งข้อมูล 'เก่า' ควรเปลี่ยนเป็นแบบอ่านอย่างเดียว เป็นไปได้ใน SQL Server หรือไม่ ฉันไม่สามารถเปลี่ยนการอนุญาตตารางเนื่องจากการอนุญาตให้อ่านอย่างเดียวควรใช้กับข้อมูลที่เก่ากว่าเกณฑ์ที่กำหนดเช่นผู้ใช้ควรจะสามารถเพิ่มและแก้ไขข้อมูลที่เพิ่มหลังจากช่วงเวลานี้
11 sql-server 

5
การใช้เครื่องมือของบุคคลที่สามเพื่อสำรองข้อมูล
มีข้อดีใดบ้างที่จะใช้เครื่องมือของบุคคลที่สามในการสำรองข้อมูล ฉันไม่ได้อ้างถึงอย่างใดอย่างหนึ่ง แต่ฉันต้องการที่จะรู้ว่าถ้ามีคนใช้พวกเขาไปยัง DB มากกว่า 200 GB เซิร์ฟเวอร์ส่วนใหญ่เป็น MSSQL 2008R2, Standard และ Enterprise Editions

2
การย้ายฐานข้อมูล SQL Server ไปยังดิสก์ใหม่ขณะออนไลน์
ฉันมีฐานข้อมูลเซิร์ฟเวอร์ SQL ขนาด 1.4TB ที่พยายามอย่างหนักกับดิสก์ I / O เราได้ติดตั้งอาร์เรย์ SSD ใหม่ลงในเซิร์ฟเวอร์ที่จะแก้ปัญหาทั้งหมดของเราเราเพิ่งจะโต้วาทีวิธีที่ดีที่สุดในการย้ายฐานข้อมูลไปทั่ว เป็นการดีถ้าเราสามารถทำได้โดยไม่หยุดทำงานนั่นเป็นสิ่งที่ดีที่สุด แต่ในกรณีที่ตัวเลือกอยู่ระหว่างสองวันของประสิทธิภาพที่ไม่ดี (เช่นขณะคัดลอกข้อมูล) เมื่อเทียบกับการหยุดทำงานสองชั่วโมงตัวเลือกหลังอาจเหมาะสมกว่า จนถึงตอนนี้วิธีแก้ไขปัญหาที่เราพบคือ: คัดลอกง่าย ใช้ฐานข้อมูลออฟไลน์คัดลอกไฟล์ข้ามเปลี่ยนตำแหน่งใน SQL Server และนำกลับมาออนไลน์ ตัวเลขคร่าวๆประมาณว่าจะใช้เวลานานถึงห้าชั่วโมงซึ่งไม่เป็นที่ยอมรับจริงๆ แต่เป็นวิธีที่ง่ายที่สุด การคัดลอกระดับบล็อก การใช้ยูทิลิตีคล้าย rsync เราจะคัดลอกไฟล์ข้ามพื้นหลังในขณะที่ฐานข้อมูลกำลังทำงาน เมื่อเราพร้อมที่จะย้ายข้อมูลเราใช้ออฟไลน์ DB ทำสำเนาที่แตกต่างกันโดยใช้ยูทิลิตี้นี้จากนั้นชี้เซิร์ฟเวอร์ SQL ไปที่ไฟล์ใหม่และนำมาออนไลน์ ไม่ทราบเวลาที่นี่ เราไม่ทราบว่าต้องใช้เวลานานเท่าใดในการวิเคราะห์ความแตกต่างของ 1.4TB และคัดลอกสิ่งนั้นข้าม ข้อกังวลอื่น ๆ ของเราคือการคัดลอกระดับบล็อกจะทำให้ไฟล์ในบางสถานะไม่สามารถอ่านได้โดย SQL Server และเราจะเสียเวลา การโยกย้าย SQL สร้างไฟล์ข้อมูล SQL ขนาด 1.4TB ใหม่บนดิสก์ใหม่และปิดใช้งาน autogrowth …
11 sql-server  ssd 

1
งานไม่ทำงานตามกำหนดเวลา
ดังนั้นฉันจึงมีงานตัวแทน SQL พื้นฐานที่รันสคริปต์ Robocopy เพื่อย้ายไฟล์ทั้งหมดจากโฟลเดอร์หนึ่งไปยังอีกโฟลเดอร์หนึ่ง Job เป็นชุดพื้นฐานที่ค่อนข้างสวย ด้วยตารางพื้นฐานที่สวย และมันก็ยังไม่ได้วิ่ง ฉันไม่ได้หมายถึงการวิ่งให้สำเร็จ มีเหตุผลใด ๆ ที่เป็นเช่นนี้หรือไม่? สำหรับข้อมูลเพิ่มเติมฉันจะเขียนสคริปต์งานเช่นกัน USE [msdb] GO /****** Object: Job [MoveMantisFilesToArchive] Script Date: 12/23/2015 10:21:52 AM ******/ BEGIN TRANSACTION DECLARE @ReturnCode INT SELECT @ReturnCode = 0 /****** Object: JobCategory [[Uncategorized (Local)]]] Script Date: 12/23/2015 10:21:52 AM ******/ IF NOT EXISTS …

2
SUM จาก DATALENGTHs ไม่ตรงกับขนาดตารางจาก sys.allocation_units
ฉันอยู่ภายใต้ความประทับใจว่าถ้าฉันจะรวมผลรวมDATALENGTH()ของเขตข้อมูลทั้งหมดสำหรับระเบียนทั้งหมดในตารางที่ฉันจะได้รับขนาดทั้งหมดของตาราง ฉันเข้าใจผิด SELECT SUM(DATALENGTH(Field1)) + SUM(DATALENGTH(Field2)) + SUM(DATALENGTH(Field3)) TotalSizeInBytes FROM SomeTable WHERE X, Y, and Z are true ฉันใช้แบบสอบถามนี้ด้านล่าง (ที่ฉันได้จากออนไลน์เพื่อรับขนาดตารางดัชนีคลัสเตอร์เท่านั้นดังนั้นจึงไม่รวมดัชนี NC) เพื่อรับขนาดของตารางเฉพาะในฐานข้อมูลของฉัน เพื่อวัตถุประสงค์ในการเรียกเก็บเงิน (เราเรียกเก็บเงินแผนกของเราตามจำนวนเนื้อที่ที่พวกเขาใช้) ฉันต้องทราบว่าแต่ละแผนกใช้พื้นที่เท่าใดในตารางนี้ ฉันมีแบบสอบถามที่ระบุแต่ละกลุ่มภายในตาราง ฉันแค่ต้องคิดออกว่าแต่ละกลุ่มจะมีพื้นที่ว่างเท่าใด ช่องว่างต่อแถวอาจแกว่งอย่างมากเนื่องจากVARCHAR(MAX)ฟิลด์ในตารางดังนั้นฉันจึงไม่สามารถใช้ขนาดเฉลี่ย * อัตราส่วนของแถวสำหรับแผนก เมื่อฉันใช้DATALENGTH()วิธีการที่อธิบายข้างต้นฉันได้รับเพียง 85% ของพื้นที่ทั้งหมดที่ใช้ในแบบสอบถามด้านล่าง คิด? SELECT s.Name AS SchemaName, t.NAME AS TableName, p.rows AS RowCounts, (SUM(a.total_pages) * 8)/1024 AS TotalSpaceMB, (SUM(a.used_pages) …

2
จัดทำดัชนีมุมมองใน SQL Server
ฉันมีตารางและมุมมองที่จัดทำดัชนีไว้เหมือนกัน Create table mytable1 (ID int identity(1,1), Name nvarchar(100)) Create table mytable2 (ID int identity(1,1), Name nvarchar(100)) Create view myview with schemabinding as select a.name, b.name from mytable1 a join mytable2 b on a.Id = b.Id ตอนนี้ถ้าฉันเรียกใช้แบบสอบถามต่อไปนี้ select a.name, b.name from mytable1 a join mytable2 b on a.Id = b.Id …

5
เหตุใดการอัปเดตนี้จึงล้มเหลวเนื่องจากมีการละเมิดข้อ จำกัด คีย์ที่ไม่ซ้ำกัน
ฉันเป็น DBA "บังเอิญ" ซึ่งค่อนข้างไม่มีประสบการณ์และรู้สึกงุนงงกับปัญหานี้ ใช้ MS SQL Server 2012 ปัญหานี้เกิดขึ้นกับคำสั่ง UPDATE นี้: UPDATE dbo.tAccts SET Ticket = 'ARP.ExGE' , Method = 'smtp' , AcctOwner = 'r00417819' , DisplayName = '~AppLight HBSFax-Inactive' , Destination = 'r00417819@mail.ad.ge.com' , UpdatedBy = SYSTEM_USER , UpdatedOn = CAST(GetDate() AS DATE) FROM dbo.vReclaimable WHERE OHR_EmpStatus <> …

1
ตัวเลือก“ ตัดทอนล็อกออนจุดตรวจสอบ” ใน SQL Server
เรื่องยาว แต่ที่ปรึกษาระยะยาวของเรา (อดีตพนักงาน) เขียนสคริปต์ที่กำหนดเองปีที่ผ่านมา (2006 หรือดังนั้น) เพื่อติดต่อกับ Tivoli Storage Manager และดูเหมือนว่ามันจะได้รับการตรวจสอบตัวเลือก SQL Server DB truncate log on checkpointชื่อ การเรียกร้องของพวกเขาคือมันป้องกันสคริปต์จากการทำงานและการสำรองข้อมูลในอินสแตนซ์ซึ่งเป็น SQL 2012 ฉันรู้สึกว่า BS นั้นสมบูรณ์เพราะฉันไม่พบตัวเลือกดังกล่าวผ่านทางsp_configureและการสำรองข้อมูลทำงานได้ทุกที่ยกเว้นกรณีเดียว อย่างไรก็ตามฉันต้องการที่จะลบทุ่นระเบิดถ้านั่นคือสิ่งที่มันเป็นและลบองค์ประกอบที่ล้าสมัยอื่น ๆ ฉันให้พวกเขาตรวจสอบกับผู้ขาย แต่ฉันไม่มีความมั่นใจในระดับสูงในสิ่งที่พวกเขาพูด การวิจัยที่ฉันได้รับกลับมายิ่งกว่านั้นอาจเป็นตัวเลือกสำหรับ SQL 2000 หรือตัวเลือก Sybase การอ้างสิทธิ์อีกอย่างคือมันถูกเรียก / ใช้โดยนัยในรุ่นที่ใหม่กว่า (2008 ขึ้นไป) เมื่อรูปแบบการกู้คืนเป็นSIMPLEและไม่มีตัวเลือกที่ชัดเจนในการเปิดหรือปิด เนื่องจากTRUNCATE LOGคำสั่งล้าสมัยเนื่องจากบันทึกการทำงานของธุรกรรมในปัจจุบันฉันคิดว่านี่ไม่ใช่ตัวเลือกที่สามารถสอบถามได้ที่จุดนี้ เนื่องจากฉันไม่มีอินสแตนซ์ของ SQL Server 2000 ฉันหวังว่าจะมีบางคนจำได้หรือสามารถตรวจสอบได้จากที่วางไว้ ฉันบอกพวกเขาว่ามันไม่มีอะไรจะแนะนำ ฉันก็หวังว่าบางคนสามารถยืนยันได้ว่านี่เป็นสิ่งล้าสมัย

1
ผลลัพธ์ที่น่าแปลกใจสำหรับประเภทข้อมูลที่มีตัวแก้ไขประเภท
ในขณะที่พูดคุยโซลูชัน CTE แบบเรียกซ้ำสำหรับคำถามนี้: รับ 5 ค่าที่แตกต่างล่าสุดสำหรับแต่ละ ID @ypercubeพบข้อผิดพลาดที่น่าแปลกใจซึ่งทำให้เราตรวจสอบการจัดการกับตัวดัดแปลงประเภท เราพบพฤติกรรมที่น่าประหลาดใจ 1. Type cast ยังคงประเภทโมดิฟายเออร์ในบางบริบท แม้เมื่อสั่งไม่ให้ ตัวอย่างพื้นฐานที่สุด: SELECT 'vc8'::varchar(8)::varchar หนึ่งอาจคาดหวังvarchar(ไม่มีตัวดัดแปลง) อย่างน้อยฉันจะ แต่ผลลัพธ์คือvarchar(8)(พร้อมตัวดัดแปลง) กรณีที่เกี่ยวข้องจำนวนมากในซอด้านล่าง 2. การต่อข้อมูล Array สูญเสียโมดิฟายเออร์ในบริบทบางอย่าง โดยไม่จำเป็นต้องใช้ดังนั้นข้อผิดพลาดนี้อยู่ฝั่งตรงข้าม: SELECT ARRAY['vc8']::varchar(8)[] , ARRAY['vc8']::varchar(8)[] || 'vc8'::varchar(8) นิพจน์แรกให้ผลvarchar(8)[]ตามที่คาดไว้ แต่ข้อที่ 2 หลังจากการต่อข้อมูลอื่นvarchar(8)จะถูกรดน้ำลงไปเพียงvarchar[](ไม่มีตัวปรับแต่ง) พฤติกรรมที่คล้ายกันจากarray_append()ตัวอย่างในซอด้านล่าง ทั้งหมดนี้ไม่สำคัญในบริบทส่วนใหญ่ Postgres จะไม่สูญเสียข้อมูลและเมื่อกำหนดให้กับคอลัมน์ค่าจะถูกบังคับให้เป็นประเภทที่ถูกต้องอย่างไรก็ตาม อย่างไรก็ตามการทำผิดในทิศทางตรงกันข้ามจะทำให้เกิดข้อยกเว้นที่น่าประหลาดใจ: 3. Recursive CTE ต้องการประเภทข้อมูลให้ตรงกัน รับตารางง่ายนี้ CREATE TABLE a ( …

1
การสร้างดัชนีบนตารางที่ยุ่งมาก
เรามีโต๊ะที่มีจำนวนมากinsert\selectทุกครั้ง (เช่น 100 เครื่องที่แทรกการอัพเดททุกวินาที) วิธีที่ดีที่สุดในการสร้างดัชนีบนตารางที่ไม่สามารถล็อคไม่ได้เป็นวินาทีคืออะไร? ถ้าฉันสร้างดัชนีฉันแน่ใจว่ามันจะล็อคคำขอและฉันทำไม่ได้ มันเป็นตารางขนาดใหญ่ที่มี 1 ล้านแถว +

4
แก้ไข XML: คุณสมบัติเป็นองค์ประกอบ
ฉันมีXMLคอลัมน์ที่มีข้อมูลที่มีโครงสร้างคล้ายกัน: <Root> <Elements> <Element Code="1" Value="aaa"></Element> <Element Code="2" Value="bbb"></Element> <Element Code="3" Value="ccc"></Element> </Elements> </Root> ฉันจะแก้ไขข้อมูลโดยใช้ SQL Server เพื่อเปลี่ยนแต่ละValueแอตทริบิวต์เป็นองค์ประกอบได้อย่างไร <Root> <Elements> <Element Code="1"> <Value>aaa</Value> </Element> <Element Code="2"> <Value>bbb</Value> </Element> <Element Code="3"> <Value>ccc</Value> </Element> </Elements> </Root> ปรับปรุง: XML ของฉันมีลักษณะเช่นนี้: <Root attr1="val1" attr2="val2"> <Elements> <Element Code="1" Value="aaa" ExtraData="extra" /> <Element Code="2" Value="bbb" ExtraData="extra" …
11 sql-server  xml  xquery 

2
ไม่พบกระบวนการที่กำลังสร้างการสำรองข้อมูล
เรามีอินสแตนซ์ของ SQL Server 2008 ติดตั้งบนเซิร์ฟเวอร์ลูกค้า แผนกไอทีของลูกค้ารับผิดชอบการสำรองข้อมูลต่าง ๆ ของเครื่อง บันทึก SQL Server แสดงว่ามีการสำรองข้อมูลเต็มรูปแบบทุกวันเวลา 19.00 น. แต่เราไม่สามารถหาหลักฐานของแผนใด ๆ ที่กำหนดไว้ใน SQL Server ช่างเทคนิคที่เราติดต่อไม่สามารถบอกเราได้ว่ามีการสำรองข้อมูลอัตโนมัติบางประเภทสิ่งที่พวกเขาบอกคือเครื่องทั้งหมดกำลังสำรอง การใช้สคริปต์ที่ฉันพบในเธรดฟอรัมนี้ฉันพบว่าชื่ออุปกรณ์จริงคือ GUID และนั่นหมายความว่านี่เป็นกระบวนการสำรองข้อมูลภายนอก : USE [msdb] GO SELECT [bs].[database_name], [bs].[backup_start_date], [bs].[backup_finish_date], [bs].Server_name, [bs].user_name AS [BackupCreator] , [bmf].physical_device_name FROM msdb..backupset bs INNER JOIN msdb..backupmediafamily bmf ON [bs].[media_set_id] = [bmf].[media_set_id] ORDER BY …

2
ไม่สามารถทำมิเรอร์ฐานข้อมูล SQL Server 2012
เมื่อพยายามทำมิร์เรอร์ฐานข้อมูลโดยใช้คำสั่งต่อไปนี้ ALTER AVAILABILITY GROUP SQLAlwaysonGroup ADD DATABASE test0916aj8CJ ฉันได้รับข้อผิดพลาดดังต่อไปนี้ ข่าวสารเกี่ยวกับ 1475, ระดับ 16, สถานะ 105, ฐานข้อมูลบรรทัดที่ 1 "test0916aj8CJ" อาจมีการเปลี่ยนแปลงบันทึกจำนวนมากที่ยังไม่ได้ทำการสำรองข้อมูล ทำการสำรองข้อมูลบันทึกบนฐานข้อมูลหลักหรือฐานข้อมูลหลัก จากนั้นเรียกคืนการสำรองข้อมูลนี้ในฐานข้อมูลมิเรอร์เพื่อเปิดใช้งานการทำมิเรอร์ฐานข้อมูลหรือในฐานข้อมูลทุติยภูมิทุกครั้งเพื่อให้คุณสามารถเข้าร่วมกลุ่มความพร้อมใช้งานได้ สามารถทำได้โดยไม่สำรองฐานข้อมูลหรือไม่ หรือฉันควรสำรองข้อมูลแล้วยกเลิกการสำรองข้อมูล มันเป็นฐานข้อมูลที่สร้างขึ้นใหม่ดังนั้นฉันไม่จำเป็นต้องสำรองข้อมูล ณ จุดนี้ ฉันได้ลองสิ่งต่อไปนี้ ... BACKUP DATABASE [test0916aj8CJ] TO DISK = N’NUL’ WITH COPY_ONLY, NOFORMAT, INIT, NAME = N’test-Full Database Backup’, SKIP, NOREWIND, NOUNLOAD GO แต่วิธีการข้างต้นไม่ได้ผลเช่นกัน ขอบคุณ

1
การทำธุรกรรมที่ชัดเจนจำเป็นต้องใช้ในขณะนี้ในวง?
SQL Server 2014: เรามีตารางที่มีขนาดใหญ่มาก (100 ล้านแถว) และเราจำเป็นต้องอัปเดตเขตข้อมูลสองสามแห่ง สำหรับบันทึกการจัดส่ง ฯลฯ เรายังต้องการเก็บไว้ในธุรกรรมที่มีขนาดพอดี หากเราปล่อยให้บิตรันด้านล่างแล้วยกเลิก / ยุติการค้นหางานที่ทำไปทั้งหมดจะถูกส่งไปหรือเราจำเป็นต้องเพิ่มคำสั่ง BEGIN TRANSACTION / END TRANSACTION เพื่อให้เราสามารถยกเลิกได้ตลอดเวลา? DECLARE @CHUNK_SIZE int SET @CHUNK_SIZE = 10000 UPDATE TOP(@CHUNK_SIZE) [huge-table] set deleted = 0, deletedDate = '2000-01-01' where deleted is null or deletedDate is null WHILE @@ROWCOUNT > 0 BEGIN UPDATE …

1
เหตุใดจึงลบคุณสมบัติเอกลักษณ์ในคอลัมน์ไม่ได้รับการสนับสนุน
ฉันได้อ่านแล้วว่าหลังจาก SQL Server 2000 ความสามารถในการ "ยกเลิกการระบุตัวตน" คอลัมน์ข้อมูลประจำตัวจะถูกลบออก และนี่คือ "โดยการออกแบบ" (ไม่ใช่แค่คุณสมบัติที่ขาดหายไป) นี่คือตัวอย่างที่ผมพบในบล็อกหนึ่ง มันเกี่ยวข้องกับการปรับปรุงตารางระบบ (และความสามารถนั้นถูกลบหลังจาก SQL Server 2000) ฉันเข้าใจว่าการทำเช่นนี้ผ่านตารางระบบไม่ใช่ความคิดที่ดี ฉันแค่สงสัยว่าทำไมคุณสมบัติที่จะทำเช่นนี้ไม่ได้อยู่ที่อื่น การหลีกเลี่ยงสิ่งนี้จะทำให้ฉันต้องทำงานเป็นจำนวนมาก (การคัดลอกแถวหลายร้อยล้านแถวไปยังตารางใหม่ในสภาพแวดล้อมที่ไม่หยุดทำงาน) ดังนั้นฉันคิดว่าฉันจะถาม "ทำไม" มีอะไรเปลี่ยนแปลงใน SQL Server 2005 และรุ่นที่ใหม่กว่าซึ่งทำให้สิ่งนี้เลว หรือว่ามันแย่เสมอและไม่เพิ่งล็อค? "แนวปฏิบัติที่ดีที่สุด" (หรือหลักการที่คล้ายกัน) ใดที่จะถูกละเมิดโดยทำให้คอลัมน์ข้อมูลประจำตัวเป็นคอลัมน์ปกติอีกครั้ง - อัปเดตเพื่อตอบคำขอ "ทำไมฉันถึงทำแบบนี้": นี่เป็นบทสรุประดับสูงมาก: ฉันจะเริ่มเพิ่มพาร์ติชันในตารางของฉัน (เพื่อให้ฉันสามารถเก็บถาวร / ล้างข้อมูลเก่า) นั่นคือทั้งหมดที่ง่าย แต่บางครั้งฉันจำเป็นต้องย้ายระเบียนไปยังพาร์ติชันที่แตกต่างกันดังนั้นจึงไม่ถูกลบออก (เมื่อพาร์ติชันเกิดขึ้นสำหรับการเก็บถาวร / ลบ) (ฉันมีการแบ่งคอลัมน์เพิ่มขึ้น 2 เพื่อให้มีพื้นที่เสมอในการย้ายแถวไปยังพาร์ติชันอื่น) แต่ถ้าคอลัมน์การแบ่งเป็นคอลัมน์ข้อมูลส่วนตัวฉันต้องลบและใส่ค่าใหม่อีกครั้ง (ไม่มีทางที่จะอัพเดทค่าของคอลัมน์ข้อมูลประจำตัว) ซึ่งทำให้เกิดปัญหากับการจำลองแบบ …

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.