Score:4

คุณสามารถปิดการเปลี่ยนแปลงฐานข้อมูลชั่วคราวใน Microsoft SQL Server ได้หรือไม่

ธง ru

ในการอัปเดตที่จะมาถึง ฉันจะต้องแปลงหลายตารางในเซิร์ฟเวอร์ของเราจาก UTF-16 เป็น UTF-8 ฉันคาดว่าจะใช้เวลาหลายชั่วโมง

มีวิธีที่ดีในการปิด INSERTS และ UPDATES แต่ยังคงอนุญาต SELECTS ในฐานข้อมูลหรือไม่

หรือฉันต้องบล็อกการเปลี่ยนแปลงในระดับธุรกิจ / ปิดฐานข้อมูลในขณะที่การอัปเดตกำลังเกิดขึ้น

joeqwerty avatar
cv flag
คุณสามารถทำให้ฐานข้อมูลเข้าสู่โหมดอ่านอย่างเดียวได้ แต่ฉันไม่รู้ว่าจะมีผลกระทบอย่างไรกับแอปพลิเคชันของคุณ หรือหากสิ่งนั้นจะขัดขวางไม่ให้คุณทำการอัปเดต/เปลี่ยนแปลง
Sir Swears-a-lot avatar
cw flag
อาจช่วยได้หากคุณสามารถชี้แจงได้ 1. การหยุดทำงานเป็นไปได้/ยอมรับได้หรือไม่? ถ้าเป็นเช่นนั้นนานแค่ไหน? db ใหญ่แค่ไหน? กี่กิกะไบต์? มีกี่โต๊ะ? คุณคาดว่าจะมีการแทรก/อัปเดตกี่ครั้งต่อชั่วโมง
Sir Swears-a-lot avatar
cw flag
คุณใช้ SQL เวอร์ชันใด ฐานข้อมูลของคุณตั้งค่าการเปรียบเทียบแบบใด คุณจะแปลงการเรียงคอลัมน์หรือไม่ หรือคุณแค่เปลี่ยนจาก nvarchar เป็น varchar?
Sir Swears-a-lot avatar
cw flag
ทำไมคุณถึงเปลี่ยนเป็น UTF8
cn flag
@ SirSwears-a-lot: UTF8 เหมาะสมกว่าสำหรับผู้ใช้ข้อมูลจำนวนมาก คล้ายกับการใช้ datetime2 แทน datetime สำหรับข้อมูลปริมาณมากในการเข้ารหัสแบบตะวันตกทั่วไป จะช่วยประหยัดพื้นที่จัดเก็บเนื่องจากอักขระส่วนใหญ่แสดงด้วยแปดบิตเท่านั้น https://techcommunity.microsoft.com/t5/sql-server/introducing-utf-8-support-for-sql-server/ba-p/734928
ru flag
@SirSwears-มาก ในกรณีของฉัน เป็นเพราะฉันถูกบังคับให้ออกแบบใหม่ทั้งหมดว่าแอปใดอ่านจากฐานข้อมูล ซึ่งรวมถึงการเปลี่ยนจากไลบรารีที่อ่าน/เขียน utf16 เป็นแอปที่อ่าน/เขียน utf8 เท่านั้น
Score:17
ธง cn

คุณอาจมี ปัญหา XY. มีวิธีทำในสิ่งที่คุณกำลังพยายามทำอยู่ โดยไม่จำเป็นต้องให้ตารางที่กำลังดำเนินการอยู่ไม่พร้อมสำหรับการกลายพันธุ์ในช่วงระยะเวลาของการดำเนินการ นี่คือวิธีที่ฉันจะแกว่ง (ระดับสูง):

  1. เพิ่มคอลัมน์ใหม่ที่มีข้อกำหนดที่ต้องการ (ประเภทข้อมูล การเรียงหน้า ฯลฯ)
  2. ใช้ทริกเกอร์ 'หลังการแทรก' เพื่อให้แน่ใจว่าการกลายพันธุ์ของข้อมูลที่มาจากแอปพลิเคชันของคุณจะเปลี่ยนแปลงคอลัมน์ใหม่ด้วย
  3. แทนที่ข้อมูลที่มีอยู่ในตาราง
  4. วางคอลัมน์เก่า เปลี่ยนชื่อคอลัมน์ใหม่ให้มีชื่อคอลัมน์เก่า
Sir Swears-a-lot avatar
cw flag
ปัญหา XY โอ้พระเจ้าที่สวยงาม ฉันเกือบจะร้องไห้ ... ;)
Score:7
ธง in

หากไม่มีความรู้เพิ่มเติมเกี่ยวกับสคีมาฐานข้อมูลของคุณ การอนุญาต ฯลฯ และแนวคิดบางอย่างเกี่ยวกับกลยุทธ์ของคุณเกี่ยวกับแอปพลิเคชันของคุณ จะเป็นการยากอย่างยิ่งที่จะกำหนดกฎเกณฑ์ อย่างน้อยที่สุด แอปพลิเคชันยังอนุญาตให้คุณทำงานในโหมดอ่านอย่างเดียวโดยที่การอัปเดตตารางถูกบล็อกหรือไม่

ในระดับพื้นๆ "ใช่" คุณก็ทำได้... ปฏิเสธ INSERT, UPDATE, DELETE บน <table> ถึง <user> อย่างไรก็ตาม ไม่สามารถบอกได้ว่าใบสมัครของคุณจะตอบสนองอย่างไร จากประสบการณ์ของฉัน แอปพลิเคชันส่วนใหญ่จะกระจายข้อผิดพลาดไปทุกที่และร้องไห้นองเลือดหากคุณทำเช่นนี้ อาจทำให้ข้อมูลเสียหายได้ (ข้อผิดพลาดที่ไม่ได้ตรวจสอบ การใช้งานธุรกรรมที่ไม่ดี ฯลฯ) น้อยครั้ง (อาจจะไม่เคย) ที่ฉันเห็นแอปพลิเคชันที่สลับเป็นโหมดอ่านอย่างเดียวอย่างสง่างามเมื่อการเข้าถึงฐานข้อมูลไม่เป็นไปตามที่ออกแบบ/คาดหวังไว้

ทดสอบ! ทดสอบ ทดสอบ ทดสอบ ในสภาพแวดล้อมที่ไม่ได้ใช้งานจริงที่มีการควบคุม จนกว่าคุณจะมีกระบวนการที่เป็นเอกสารรองรับการเปลี่ยนแปลงของคุณ

หากข้อกำหนดของคุณไม่อนุญาตให้มีการหยุดทำงานเป็นเวลานาน (หรือไม่มีการหยุดทำงานเลย) มีวิธีที่ซับซ้อนกว่านี้ในการจัดการกับสิ่งนี้ ความคิดหนึ่งคือการเพิ่มทริกเกอร์หลังการแทรก / หลังการอัปเดตเพื่อแปลงเรกคอร์ดใหม่ / อัปเดตในฟิลด์ใหม่โดยอัตโนมัติในขณะที่คุณเรียกใช้การบำรุงรักษาในชุดงานขนาดเล็ก เมื่อแปลงข้อมูลทั้งหมดแล้ว ให้สลับแอปพลิเคชันไปยังฟิลด์ใหม่และวางฟิลด์เก่า

dave_thompson_085 avatar
jp flag
ค่อนข้างแดกดัน Stack เองปีละสองสามครั้งทำการทดสอบหรือการทดลองซึ่งทำให้ db (ที่เกี่ยวข้อง) อ่านได้อย่างเดียวเป็นระยะเวลาปานกลางเช่นครึ่งชั่วโมง และเท่าที่ฉันสังเกต (จากภายนอก) พวกเขาทำค่อนข้างสะอาด: มี กล่องสีเหลืองที่เห็นได้ชัดเจนแต่ไม่น่ารังเกียจที่ด้านบนของแต่ละหน้าที่ประกาศสถานะและคลิกได้ที่ต้องเขียนถูกปิดใช้งาน
Doug avatar
in flag
ใช่ แต่ความมหัศจรรย์อยู่ที่วิธีที่พวกเขาทำ ฉันเคยเห็นแอปพลิเคชันหลายตัวที่มีปุ่มกำหนดค่าเพื่อหยุดการอัปเดต อย่างไรก็ตาม แอปพลิเคชันนี้เป็นแบบอ่านอย่างเดียวจริงๆ ที่ชั้นแอปพลิเคชันแทนที่จะเป็นฐานข้อมูล เช่น. แอปพลิเคชันหยุดอนุญาตให้ผู้ใช้เปลี่ยนบันทึก แต่ในความเป็นจริงแอปพลิเคชันยังสามารถเขียนไปยังฐานข้อมูลได้ ระบบที่ซับซ้อน (StackExchange) จะมีสวิตช์แบบอ่านอย่างเดียวของเลเยอร์แอปพลิเคชันที่ซับซ้อน ฉันไม่เคยเห็นแอปพลิเคชั่นที่เปลี่ยนเป็นโหมดอ่านอย่างเดียวอย่างสง่างามเมื่อคาดหวัง แต่ปฏิเสธการเขียนที่ชั้นฐานข้อมูล
Score:0
ธง cw

นอกเหนือจาก UTF-8 และ UTF-16 แล้ว ฉันคิดว่าคำถามที่ใหญ่กว่าที่คุณถามคือวิธีปรับใช้การเปลี่ยนแปลงกับระบบการผลิตโดยมีเวลาหยุดทำงานน้อยที่สุด ฉันแน่ใจว่ามีหลายวิธี แต่นี่คือวิธีที่ฉันจะทำ

  1. สร้างสำเนาฐานข้อมูลของคุณ
  2. เรียกใช้การอัปเดตสคีมาของคุณบนสำเนา
  3. ใช้ผลิตภัณฑ์เช่น Redgate SQL เปรียบเทียบ หรือเขียนสคริปต์ของคุณเองเพื่อซิงโครไนซ์ข้อมูลของคุณ เข้าใกล้ให้ได้มากที่สุด
  4. ปิดแอป ซิงค์ใหม่ครั้งสุดท้าย
  5. เปลี่ยนการเชื่อมต่อฐานข้อมูลเป็นฐานข้อมูลใหม่ (หรือเปลี่ยนชื่อฐานข้อมูล)
  6. รีสตาร์ทแอปพลิเคชัน

ฉันรู้ว่าสิ่งนี้ฟังดูง่ายและอาจใช้ไม่ได้ด้วยเหตุผลหลายประการ แต่ก็คุ้มค่าที่จะตรวจสอบ

ฉันต้องการทำเช่นนี้ด้วยเหตุผลบางประการ การหยุดทำงานและส่งผลกระทบต่อผู้ใช้น้อยที่สุด ตัวเลือกการย้อนกลับที่ปลอดภัย โอกาสในการทดสอบผลกระทบของการเปลี่ยนแปลงสคีมา/ข้อมูล

ฉันขอขอบคุณที่การดำเนินการนี้จะซับซ้อนมากขึ้นหากมีแอปอื่นหรือการเชื่อมต่อกับฐานข้อมูลของคุณ แต่การย้อนกลับการอัปเกรดที่ล้มเหลวก็ไม่สนุกเช่นกัน

sn flag
*"Redgate SQL"* คืออะไร เป็นส่วนหนึ่งของ *Redgate Data Tools*? *พร้อมโรลคอร์*? *SQL พรอมต์คอร์*? *การค้นหา SQL*? อื่น ๆ อีก?
Sir Swears-a-lot avatar
cw flag
@PeterMortensen ฉันขอโทษ "การเปรียบเทียบ Redgate SQL" สามารถใช้สำหรับการซิงโครไนซ์ฐานข้อมูล

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา