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

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

5
ฉันจะตรวจพบโพรซีเดอร์ที่เก็บที่เสียหายหลังจากการเปลี่ยนแปลงสกีมา
ฉันได้แก้ไขตารางกลางในฐานข้อมูลของฉันและ sp_depends ส่งคืนผลลัพธ์หลายร้อยรายการอย่างแท้จริงและฉันกังวลว่าบางขั้นตอนการจัดเก็บอาจไม่ได้รวบรวมอีกต่อไปหลังจากการเปลี่ยนแปลงของฉัน การตรวจสอบหนึ่งโพรซีเดอร์ที่เก็บไว้นั้นง่ายมาก (ฉันเพิ่งรันสคริปต์แก้ไขและดูว่าการดำเนินการสำเร็จหรือไม่) แต่การทำอย่างนั้นกับ 100 โพรซีเดอร์นั้นค่อนข้างยุ่งยาก ฉันรู้ว่าฉันสามารถใช้สคริปต์เช่นนี้เพื่อรวบรวมวัตถุทั้งหมดของฐานข้อมูลของฉันได้ แต่การดำเนินการจริงจะเกิดขึ้นในครั้งต่อไปที่มีการเรียกใช้กระบวนงานที่เก็บไว้ไม่ใช่ทันทีดังนั้นจึงไม่เหมาะสมในกรณีของฉัน ฉันยังคิดว่าฉันสามารถลบโพรซีเดอร์ที่เก็บไว้ทั้งหมดและปรับฐานข้อมูลของฉันใหม่ด้วยระบบควบคุมแหล่งที่มาของฉัน แต่ตัวเลือกนั้นถึงแม้ว่าจะใช้งานได้จริง มีวิธีที่ดีกว่าในการทำเช่นนี้? ฉันใช้ SQLServer 2008 R2 และสคริปต์ฐานข้อมูลของฉันถูกเก็บไว้ในโครงการฐานข้อมูล VS 2008 เพื่อความกระจ่างแจ้งฉันไม่ได้ขอแนะนำให้ใช้วิธีทดสอบรหัสนี้เพียงอย่างเดียว เหมือนกับใน c # คุณตรวจพบข้อผิดพลาดทางไวยากรณ์ทันทีในไฟล์ที่ขึ้นต่อกันอื่น ๆ ในขณะที่คุณโค้ด (และจากนั้นใช้กลยุทธ์อื่น ๆ เพื่อทดสอบเช่นการทดสอบหน่วยซึ่งมักจะมีขนาดของคำสั่งช้าลง) ข้อผิดพลาดในไม่กี่วินาทีแทนที่จะต้องทำการทดสอบการทำงานเต็มรูปแบบซึ่งโดยทั่วไปอาจใช้เวลาสองสามชั่วโมงกว่าจะเสร็จสมบูรณ์

1
ทำความเข้าใจกับขนาดบล็อก
คำถามของฉันตั้งเป้าหมาย Postgres แต่คำตอบอาจดีพอที่มาจากพื้นหลังฐานข้อมูลใด ๆ สมมติฐานของฉันถูกต้อง: ดิสก์มีขนาดบล็อกคงที่หรือไม่ ตัวควบคุม RAID สามารถมีขนาดบล็อก differnt ได้หรือไม่ หนึ่ง RAID block ถูกแบ่งออกเป็นหลายบล็อกดิสก์จริงหรือไม่? ระบบไฟล์ยังมีขนาดบล็อกอิสระซึ่งจะถูกแบ่งออกเป็นขนาดบล็อก RAID อีกครั้ง Postgres ทำงานกับบล็อกขนาด 8k แบบคงที่ การแม็พกับขนาดบล็อกของระบบไฟล์เกิดขึ้นที่นี่ได้อย่างไร? Postgres บล็อกขนาด 8k ถูกรวมเข้าด้วยกันด้วยระบบไฟล์หรือไม่? เมื่อทำการตั้งค่าระบบจะดีที่สุดถ้ามีบล็อคทั้งหมดที่ 8k? หรือการตั้งค่าไม่ใช่เรื่องจริง? ฉันยังสงสัยด้วยว่าการตั้งค่าขนาดบล็อกที่ "ผิด" อาจทำให้ข้อมูลสมบูรณ์ในกรณีที่เกิดความผิดพลาดหรือไม่? บางทีถ้าบล็อก Postgres 8k ต้องถูกแบ่งออกเป็นหลายบล็อกดิสก์ หรือไม่มีอะไรเข้าชุดกันและดังนั้นฉันจึงหลวมพื้นที่ดิสก์ที่ไม่ตรงกันทุกครั้งระหว่างขนาดบล็อกที่กำหนด?

3
การจัดเก็บวันที่เป็นจำนวนเต็ม (ตัวเลข) ข้อดีคืออะไร
คำถามที่ 1 ฉันกำลังทำงานกับระบบที่เก็บวันที่เป็นจำนวนเต็ม (ตัวเลขจริง (8,0)) และฉันสังเกตเห็นว่าระบบอื่น ๆ เก็บวันที่เป็น int เช่นซิสโก้ในหัวข้อนี้ ตัวอย่าง 20120101 -- 01 Jan 2012 มีข้อได้เปรียบอะไรบ้างในการรักษาระบบวันที่เป็นตัวเลขและไม่ได้ใช้ SQL Datetime? คำถามที่ 2 ตอนนี้ฉันพยายามวนวันที่เป็นตัวเลขเพื่อค้นหาลูกค้าระหว่างสองวัน หากstartและenddateรวมสองเดือนฉันจะได้รับบันทึกนับพันแทนที่จะเป็นเพียง 60 ตัวอย่าง: create table #temp1(day int,capacity int) /* just a temp table */ declare @start int declare @end int set @start=20111201 set @end = 20120131 while (@start …

2
โพสต์การค้นหาข้อความแบบเต็มด้วยหลายคอลัมน์ทำไมข้อตกลงในดัชนีและไม่อยู่ในรันไทม์
ฉันเจอการค้นหาข้อความแบบเต็มใน postgres ในไม่กี่วันที่ผ่านมาและฉันสับสนเล็กน้อยเกี่ยวกับการจัดทำดัชนีเมื่อค้นหาในหลายคอลัมน์ เอกสาร postgres พูดคุยเกี่ยวกับการสร้างts_vectorดัชนีในคอลัมน์ที่ต่อกันเช่น: CREATE INDEX pgweb_idx ON pgweb USING gin(to_tsvector('english', title || ' ' || body)); ซึ่งฉันสามารถค้นหาดังนี้: ... WHERE (to_tsvector('english', title||' '||body) @@ to_tsquery('english', 'foo')) อย่างไรก็ตามหากฉันต้องการค้นหาเฉพาะชื่อบางครั้งแค่เนื้อหาและบางครั้งทั้งสองฉันจะต้องมีดัชนีแยก 3 ตัว และถ้าฉันเพิ่มในคอลัมน์ที่สามนั่นอาจเป็น 6 ดัชนีและอื่น ๆ อีกทางเลือกหนึ่งที่ฉันไม่ได้เห็นในเอกสารเป็นเพียงการจัดทำดัชนีสองคอลัมน์แยกกันจากนั้นใช้WHERE...ORแบบสอบถามปกติ: ... WHERE (to_tsvector('english', title) @@ to_tsquery('english','foo')) OR (to_tsvector('english', body) @@ to_tsquery('english','foo')) การเปรียบเทียบทั้งสองแถวบน ~ 1 …

2
จะใช้ RESTRICT สำหรับ Foreign Key ใน mysql ได้อย่างไร
ในโครงสร้างฐานข้อมูลของ CREATE TABLE Country ( name varchar(40) NOT NULL, PRIMARY KEY (name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE City ( name varchar(40) NOT NULL, PRIMARY KEY (name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE Map ( country varchar(40) NOT NULL, city varchar(100) NOT NULL, PRIMARY KEY (country,city), FOREIGN KEY (country) REFERENCES …

2
ดูการใช้งานหน่วยความจำ Postgresql
ฉันใช้งาน Postgresql บนเซิร์ฟเวอร์ Ubuntu และต้องสามารถตรวจสอบการใช้งานหน่วยความจำได้ ขณะนี้ฉันมีสคริปต์ที่ทำงานในงาน cron หนึ่งนาทีที่ตรวจสอบ / บันทึกสถิติต่างๆและจำเป็นต้องตรวจสอบ / บันทึกการใช้งานหน่วยความจำปัจจุบันของ Postgresql ฉันค้นหาไปแล้วและไม่สามารถหาอะไรได้มากไปกว่าความจริงที่ว่า Postgresql ใช้หน่วยความจำที่ใช้ร่วมกันได้ดีดังนั้นค่าที่กำหนดโดยโปรแกรมเช่น 'top' นั้นไม่ถูกต้อง ฉันจะตรวจสอบการใช้งานหน่วยความจำทั้งหมดของ Postgresql ได้ตลอดเวลาที่กำหนดไว้อย่างไร ข้อมูลนี้จะถูกนำมาใช้ในการสร้างกราฟสำหรับการวิเคราะห์ในภายหลัง

3
การใช้ความสัมพันธ์แบบหนึ่งถึงศูนย์หรือหนึ่งความสัมพันธ์ใน SQL
ให้เราบอกว่าฉันกำลังออกแบบฐานข้อมูลสำหรับสถานการณ์ที่มีความสัมพันธ์แบบหนึ่งต่อศูนย์หรือหนึ่ง (1-0..1) ตัวอย่างเช่น: มีชุดของเป็นผู้ใช้และบาง ผู้ใช้ก็อาจจะเป็นลูกค้า ดังนั้นฉันจึงสร้างตารางที่สอดคล้องกันสองตารางusersและcustomersแต่ ... ... วิธีที่ดีที่สุดในการแสดงและนำสถานการณ์นี้ไปใช้ในแพลตฟอร์ม SQL ที่กำหนดคืออะไร ฉันได้พิจารณาวิธีแก้ปัญหาที่เป็นไปได้สองข้อแล้ว: ในusersตารางเพิ่มcustomerคอลัมน์ซึ่งอาจเป็นการอ้างอิงคีย์ต่างประเทศcustomersหรือNULLเครื่องหมาย ในcustomersตารางรวมuserคอลัมน์ (ตั้งค่าด้วยUNIQUEข้อ จำกัด ) ซึ่งชี้ไปที่usersตาราง ฉันได้ถามคำถามที่คล้ายกันในฟอรัมแล้ว แต่คำตอบก็คือ "สิ่งที่คุณต้องการ", "อะไรก็ตามที่คุณคิดว่าสะดวก" ฉันไม่ชอบคำตอบแบบนี้ ฉันต้องการทฤษฎี DB ที่จริงจังแทนคำตอบที่ได้รับการยอมรับอย่างดี ฉันจะอ่านความสัมพันธ์เกี่ยวกับ 1-0..1 ได้ที่ไหน

2
การรับ“ สิทธิ์ SELECT ถูกปฏิเสธบนวัตถุ” แม้ว่าจะได้รับอนุญาตแล้วก็ตาม
ฉันเป็นโปรแกรมเมอร์ไม่ใช่ dba ... ฉันรู้ว่าเพียงพอที่จะเป็นอันตราย ฉันได้รับมรดกฐานข้อมูลด้วยผู้ใช้ดั้งเดิมที่เป็น db_owner สำหรับฐานข้อมูล เราไม่สามารถปรับการอนุญาตของผู้ใช้นี้สำหรับตาราง schema ที่มีอยู่ ฯลฯ ด้วยเหตุผลทางธุรกิจ แต่มีการสร้างตารางใหม่บางตารางขึ้นและฉันต้องการให้ผู้ใช้นี้มีสิทธิ์เข้าถึง SELECT เหล่านั้นเท่านั้น มีการตั้งค่าการอนุญาตสำหรับผู้ใช้นี้สำหรับตารางเหล่านี้เพื่อให้ทุกอย่างถูกปฏิเสธยกเว้น SELECT ซึ่งตั้งค่าเป็น GRANT แต่เมื่อผู้ใช้นี้ (dbadmin) พยายามทำการเลือกบนหนึ่งในตารางเหล่านี้ (AccountingAudit) ข้อผิดพลาดนี้เกิดขึ้น: The SELECT permission was denied on the object 'AccountingAudit', database 'billing', schema 'dbo'. ฉันใช้ SQL นี้เพื่อลองดูว่ามีการตั้งค่าการอนุญาตสำหรับตาราง / ผู้ใช้นี้: select object_name(major_id) as object, user_name(grantee_principal_id) as grantee, user_name(grantor_principal_id) …

1
รีบูตเครื่อง MySQL Replication Slave
เป็นครั้งแรกนับตั้งแต่มีการตั้งค่าฉันจำเป็นต้องรีบูตทาสการจำลองแบบ MySQL แบบอ่านอย่างเดียว ฉันพบบทความนี้เกี่ยวกับการทำให้ทาสตกต่ำเพื่อการบำรุงรักษา (แม้ว่าเขาจะอธิบายการหยุดmysqldaemon): วิธีการอย่างปลอดภัย [sic] รีสตาร์ทเซิร์ฟเวอร์ MySQL Slave ของคุณ โดยสรุปขั้นตอนคือ: ในmysqlลูกค้า: STOP SLAVE; FLUSH TABLES; จากระบบปฏิบัติการ: /etc/init.d/mysql stop ฉันจะรีบูทที่จุดนี้จากนั้นหลังจากระบบบูท: ในmysqlไคลเอนต์ ( mysqldaemon ถูกกำหนดค่าให้เริ่มการบู๊ต): START SLAVE; มันดูถูกหรือไม่? มีอะไรอีกบ้างที่ฉันควรทำ?

2
ประสิทธิภาพของทริกเกอร์ vs ขั้นตอนการจัดเก็บใน MySQL
โพสต์ที่นี่ใน DBA.StackExchange ( อะไรคือแนวทางปฏิบัติที่ดีที่สุดสำหรับทริกเกอร์เพื่อรักษาหมายเลขการแก้ไขเรคคอร์ด? ) ทำให้เกิดคำถามที่น่าสนใจ (อย่างน้อยก็น่าสนใจสำหรับฉัน) เกี่ยวกับประสิทธิภาพใน MySQL บริบทคือเราต้องการแทรกระเบียนในตารางสำหรับแต่ละแถวที่มีการปรับปรุง ก่อนที่จะอัปเดตแถวเราต้องการเก็บค่าก่อนหน้าจากนั้นเพิ่มหนึ่งในคอลัมน์ (คอลัมน์ "รุ่น") หากเราทำสิ่งนี้ภายในทริกเกอร์มันจะทำงานได้ดี สำหรับ MySQL ทริกเกอร์เป็นแบบทีละแถวดังนั้นมันจึงเป็นทางออกที่ง่าย เลือกข้อมูลในตารางปัจจุบันแทรกลงในตารางการบันทึกและอัปเดตคอลัมน์ "version" ในข้อมูลใหม่ อย่างไรก็ตามเป็นไปได้ที่จะย้ายตรรกะนี้ไปยังกระบวนงานที่เก็บไว้ หากคุณทำเช่นนั้นคุณกำลังทำการแทรกแล้วเพิ่มคอลัมน์ "รุ่น" ในตาราง สิ่งทั้งหมดจะถูกตั้งค่าตาม ดังนั้นเมื่อมันมาถึงการแทรกนี้นี้จะมีประสิทธิภาพมากกว่าที่จะใช้วิธีการจัดเก็บตามชุดหรือวิธีการตามทริกเกอร์? คำถามนี้มีไว้สำหรับ MySQL (เนื่องจากมีทริกเกอร์แบบทีละแถว) แม้ว่าจะสามารถนำไปใช้กับ DBMS ทริกเกอร์แบบแถวต่อแถวอื่น ๆ ได้

3
เหตุใด. bak จึงเล็กกว่าฐานข้อมูลที่สำรองไว้มาก
ฉันเพิ่งสำรองฐานข้อมูล SQL Server ไฟล์ MDF และ LDF รวมกันประมาณ 29 GB แต่ไฟล์. bak มีขนาดเพียง 23 GB ซึ่งเล็กกว่าประมาณ 20% การเดาครั้งแรกของฉันเมื่อชุดข้อมูลหนึ่งรุ่นมีขนาดเล็กกว่ารุ่นอื่นที่มีข้อมูลเดียวกันจะเป็นการบีบอัดข้อมูล แต่การบีบอัดมักจะให้อัตราการบีบอัดที่ดีกว่า 20% โดยเฉพาะอย่างยิ่งสำหรับข้อมูลที่สั่งสูง ) นอกจากนี้ข้อมูลที่บีบอัดไม่สามารถบีบอัดได้ง่ายขึ้นอีก แต่ฉันรู้ว่าไฟล์. bak สามารถบีบอัดได้ ดังนั้นหากข้อมูลไม่ถูกบีบอัดและไม่มีการยกเลิก (เนื่องจากจุดทั้งหมดของการสำรองข้อมูลจะสามารถกู้คืนข้อมูลกลับสู่สถานะเดิมหลังจากนั้น) แล้ว 20% ที่ไม่ถูกต้องคืออะไร

1
เวลาดำเนินการสืบค้นใน Oracle SQL Developer
ฉันรู้ว่าฉันสามารถใช้set timing onเพื่อดูว่าต้องใช้เวลานานเท่าใดในการเรียกใช้คิวรีหลังจากการดำเนินการเสร็จสิ้น แต่เป็นไปได้ไหมที่จะเห็นระยะเวลาดำเนินการปัจจุบันใน Oracle SQL Developer ในขณะที่แบบสอบถามยังคงทำงานอยู่ SQL Server Management Studio และ Query Analyzer มีคุณสมบัติดังต่อไปนี้:
11 oracle  tools 

3
SQL Server: กลุ่มไฟล์สำหรับตารางระบบเท่านั้น
หนึ่งในมาตรฐานองค์กรของเราคือมีกลุ่มไฟล์ / ไฟล์แยกต่างหากสำหรับตารางผู้ใช้ / ดัชนี ค่านี้ถูกตั้งค่าเป็นค่าเริ่มต้นดังนั้นไม่จำเป็นต้องมีคุณสมบัติในการสร้างคำสั่ง CREATE TABLE ดังนั้นดูเหมือนว่านี้ fileid 1 = ตารางระบบ, MDF fileid 2 = t-log = LDF fileid 3 = สิ่งที่ผู้ใช้ = NDF ทุกคนที่นี่สามารถช่วยฉันเข้าใจเหตุผลดั้งเดิมได้ไหมว่าทำไมเรื่องนี้ถึงได้รับคำสั่ง? ฉันจะมาทำความสะอาดและฉันคิดว่ามันเป็นของขึ้น Am ฉันผิด ... ? แก้ไข: ฉันรู้วิธีใช้กลุ่มไฟล์เพื่อแยกดัชนี / พาร์ติชั่น / ไฟล์เก็บถาวรรวมถึงวิธีการกู้คืนทีละน้อย คำถามนี้เกี่ยวกับการใช้กลุ่มไฟล์แยกต่างหากในปริมาณเดียวกันสำหรับตารางระบบเท่านั้น

2
ป้องกัน SSMS จากการดูระบบไฟล์ของเซิร์ฟเวอร์
ฉันมีผู้ใช้หลายคนที่ใช้เซิร์ฟเวอร์ MS SQL ร่วมกันภายใต้การดูแลของฉัน พวกเขาไม่ควรเห็น (หรือแม้กระทั่งระวัง) ของผู้ใช้รายอื่นและข้อมูลของพวกเขาบนเซิร์ฟเวอร์นั้น ผู้ใช้แต่ละคนมีฐานข้อมูลของตัวเอง พวกเขาสามารถทำสิ่งที่พวกเขาต้องการด้วยฐานข้อมูลของพวกเขา ฉันใช้Partial Containmentคุณสมบัติของ SQL Server เพื่อล็อคผู้ใช้งาน ล็อกอินถูกสร้างขึ้นภายในฐานข้อมูล วิธีนี้ใช้งานได้ดีเนื่องจากไม่เห็นบัญชีผู้ใช้หรือฐานข้อมูลอื่นด้วยวิธีนี้ การเข้าสู่ระบบฐานข้อมูลถูกเพิ่มไปยังบทบาทฐานข้อมูลที่ฉันสร้างด้วยคำสั่งนี้: USE dbname CREATE ROLE dbrole GRANT SELECT, INSERT, UPDATE, DELETE, CREATE TABLE, CREATE VIEW, ALTER ANY SCHEMA TO dbrole DENY EXECUTE TO dbrole ฉันสร้างบัญชีเข้าสู่ระบบ db ใหม่และเพิ่มไปยังบทบาทที่กล่าวไว้เท่านั้น ผู้ใช้ไม่มีสิทธิ์อื่น ๆ (ที่ฉันรู้) ปัญหาเดียวที่เหลืออยู่คือ SSMS ยังคงสามารถเรียกดูระบบไฟล์ของเซิร์ฟเวอร์ได้ ถ้าฉันคลิกขวาที่ฐานข้อมูลและเลือกTasks …

1
ตรรกะอ่านบนโต๊ะ temp ทั่วโลก แต่ไม่ได้อยู่ในตาราง temp ระดับเซสชั่น
พิจารณา MCVE แบบง่าย ๆ ต่อไปนี้: SET STATISTICS IO, TIME OFF; USE tempdb; IF OBJECT_ID(N'tempdb..#t1', N'U') IS NOT NULL DROP TABLE #t1; CREATE TABLE #t1 ( r int NOT NULL ); IF OBJECT_ID(N'tempdb..##t1', N'U') IS NOT NULL DROP TABLE ##t1; CREATE TABLE ##t1 ( r int NOT NULL ); IF OBJECT_ID(N'dbo.s1', …

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