ทริกเกอร์และขั้นตอนการถ่ายโอนข้อมูล mysqldump สามารถ


10

มีวิธีการสร้าง mysqldump ซึ่งจะบันทึกทริกเกอร์และขั้นตอนทั้งหมดจากฐานข้อมูลที่ระบุหรือไม่?

บางครั้งก่อนหน้านี้ฉันอ่านแล้วว่าmysqldumpจะช่วยทริกเกอร์ของฉันด้วย แต่มันก็ดูไม่เหมือนกัน คำถามที่สองของฉันคือฉันจะตรวจสอบในไฟล์ sql ได้อย่างไรถ้ามีทริกเกอร์อยู่

คำตอบ:


9

ปกติฉันจะไม่แยกทริกเกอร์จากตารางที่มีไว้สำหรับ ฉันถ่ายโอนข้อมูลเช่นนี้:

mysqldump -u... -p... --no-data --routines --triggers dbname > DBSchema.sql

ตรวจสอบสถานะของกิจวัตรและทริกเกอร์ดังนี้:

SELECT COUNT(1) FROM mysql.proc;

SELECT COUNT(1) FROM information_schema.triggers;

SELECT * FROM information_schema.triggers\G

หากคุณต้องการทำสิ่งนี้ให้กับฐานข้อมูลทั้งหมดในอินสแตนซ์ MySQL ให้ทำดังนี้

mysql -u... -p... -A -N -e"SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('information_schema','mysql')" > /tmp/dblist.txt
for DB in `cat /tmp/dblist.txt`
do
    mysqldump -u... -p... --no-data --no-create-info --routines dbname > ${DB}-routines.sql
    mysqldump -u... -p... --no-data --triggers dbname > ${DB}-schema-triggers.sql
done

ด้วยวิธีนี้โพรซีเดอร์ที่เก็บจะไปในดัมพ์รูทีนสำหรับ DB ขณะที่สกีมาและทริกเกอร์ไปที่ดัมพ์อื่น


@dole Rolando ถูกต้องเกี่ยวกับวิธีการทริกเกอร์ / โพรซีเดอร์ หากคุณต้องการดูว่ามีไฟล์อยู่ในไฟล์ sql หรือไม่ให้เปิดและค้นหาการโทร 'สร้างทริกเกอร์' หากอยู่ใน * ระวังgrep 'CREATE TRIGGER'
Derek Downey

@RolandoMySQLDBA ไม่ได้--triggersถูกทิ้งตามค่าเริ่มต้นหรือไม่ ความแตกต่างระหว่าง--no-data --routines --triggersvs --no-data --routinesคืออะไร?
Pacerier

1
@Pierier มีสถานการณ์ที่ฉันไม่ต้องการทริกเกอร์และฉันจะใช้--skip-triggersในโอกาสเช่นนี้ (เช่นการตั้งค่าทาสที่ไม่ต้องการทริกเกอร์) เพื่อเป็นการเตือนตัวเองอย่างต่อเนื่องถึงความเป็นไปได้ของการข้ามตัวเลือกฉันมักจะใช้ค่าสถานะบางอย่างใน mysqldumps ( --routines, --triggers) แม้ว่าจะเป็นค่าเริ่มต้นก็ตาม ดังนั้นมันเป็นเพียงการตั้งค่าส่วนตัว หากคุณเชื่อมั่นว่าการตั้งค่าเริ่มต้นจะยังคงเป็นค่าเริ่มต้นจากรุ่นสู่รุ่นและไม่เคยจัดการกับสถานการณ์ adhoc จากนั้นคุณจะแสดง mysqldumps ตามความจำเป็นตราบเท่าที่ mysqldump ที่ได้นั้นถูกต้องสำหรับคุณ
RolandoMySQLDBA

@RolandoMySQLDBA - A -N ทำอะไรได้บ้าง
MontyPython

ฉันใช้นิพจน์ทั่วไปเพื่อเพิ่มคำสั่งทริกเกอร์ DROP: แทนที่สิ่งนี้: (\ / * \! 50003 CREATE * \ / \ / * \! 50017 DEFINER \ = some_text_here * \ / \ / * \! 50003 TRIGGER (. *?) ) ด้วยสิ่งนี้: DROP TRIGGER / *! 50032 IF EXISTS * / $2;; \ n $ 1
AlexandruSerban
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.