ฉันจะย้ายฐานข้อมูลจากเซิร์ฟเวอร์หนึ่งไปยังเซิร์ฟเวอร์อื่นได้อย่างไร


136

ฉันจะย้ายตาราง MySQL จากเซิร์ฟเวอร์จริงหนึ่งไปยังอีกเซิร์ฟเวอร์หนึ่งได้อย่างไร

เช่นสถานการณ์ที่แน่นอน: ฉันมีเซิร์ฟเวอร์ MySQL ที่ใช้ตาราง innodb และมีขนาดประมาณ 20GB

ฉันต้องการย้ายไปยังเซิร์ฟเวอร์ใหม่วิธีที่มีประสิทธิภาพที่สุดในการทำเช่นนี้คืออะไร


4
ฉันจะใช้ xtrabackup percona.com/docs/wiki/ มันเหมือนกับการคัดลอกมันไป แต่คุณสามารถให้เซิร์ฟเวอร์ทำงานต่อไปและสมมติว่าคุณใช้ตาราง innodb เป็นหลัก (ซึ่งคุณบอกว่าคุณมี) คุณสามารถพิจารณาได้ว่าเป็น "hot" สำรองข้อมูลเช่นกัน
Jonathan

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

คำตอบ:


80

วิธีที่ฉันชอบคือไพพ์คำสั่ง sqldump ไปยังคำสั่ง sql คุณสามารถทำฐานข้อมูลทั้งหมดหรือเฉพาะ ตัวอย่างเช่น

mysqldump -uuser -ppassword myDatabase | mysql -hremoteserver -uremoteuser -premoteserverpassword 

คุณสามารถทำฐานข้อมูลทั้งหมดด้วย

mysqldump --all-databases -uuser -ppassword | mysql -hremoteserver -uremoteuser -premoteserver 

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


4
เคล็ดลับ: netcatถ้าฐานข้อมูลไม่อนุญาตให้เชื่อมต่อระยะไกลท่อผ่าน
Bart van Heukelom

1
เพื่อให้ทำงานได้สำหรับฉันฉันต้องสร้างฐานข้อมูลเปล่าที่มีชื่อเดียวกันบนเซิร์ฟเวอร์ระยะไกลแล้วเพิ่มชื่อของฐานข้อมูลนั้นที่ส่วนท้ายของคำสั่ง
Zugwalt

1
นี่เป็นรูปลักษณ์ที่สวยงาม แต่ไม่มีการบีบอัดข้อมูลที่รวดเร็วเพียงพอสำหรับฐานข้อมูล 20GB
Daddy32

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

นี่มันเร็วมาก! แต่สิ่งที่ @Zugwalt พูดนั้นเป็นความจริงสำหรับฉันเช่นกัน คำสั่งไม่ทำงานจนกว่าฉันจะสร้างฐานข้อมูล (ว่าง) เพิ่มเพิ่มชื่อฐานข้อมูลที่ส่วนท้ายของคำสั่ง
Skeets

65

ฉันเพิ่งย้ายฐานข้อมูล 30GB ด้วย stragegy ต่อไปนี้:

เซิร์ฟเวอร์เก่า

  • หยุดเซิร์ฟเวอร์ mysql
  • คัดลอกเนื้อหาของdatadirไปยังตำแหน่งอื่นบนดิสก์ ( ~/mysqldata/*)
  • เริ่มต้นเซิร์ฟเวอร์ mysql อีกครั้ง (การหยุดทำงานคือ 10-15 นาที)
  • บีบอัดข้อมูล ( tar -czvf mysqldata.tar.gz ~/mysqldata)
  • คัดลอกไฟล์บีบอัดไปยังเซิร์ฟเวอร์ใหม่

เซิร์ฟเวอร์ใหม่

  • ติดตั้ง mysql (ไม่เริ่ม)
  • คลายการบีบอัดไฟล์ ( tar -xzvf mysqldata.tar.gz)
  • ย้ายเนื้อหาของ mysqldata ไปยังdatadir
  • ตรวจสอบให้แน่ใจว่า innodb_log_file_size ของคุณเหมือนกันบนเซิร์ฟเวอร์ใหม่หรือหากไม่ใช่อย่าคัดลอกไฟล์บันทึกเก่า ( mysql จะสร้างสิ่งเหล่านี้ )
  • เริ่ม mysql

1
ข้ามสำเนาหลังจากการบีบอัด / คลายการบีบอัด สตรีม tar ผ่านเครือข่ายโดยใช้ ssh หรือ (ถ้าหากเฉพาะในเครือข่ายส่วนตัวที่ปลอดภัยอ่าน: ไม่ใช่อินเทอร์เน็ต) ใช้ netcat เพื่อหลีกเลี่ยงการเข้ารหัสค่าใช้จ่าย นอกจากนี้หากในเครือข่ายท้องถิ่นข้าม gzipping ถ้าคุณมีท่อเครือข่ายที่รวดเร็วคุณจะพบว่าการถ่ายโอนคอขวดบนแกนหมุนที่ตรึงแกนไว้ทำการบีบอัด
atxdba

มันใช้งานได้ทั้ง innodb และ myisam? นอกจากนี้ผู้ใช้ mysql อยู่ใน datadir เช่นกัน?
giorgio79

2
@ giorgio79 แน่นอนว่าตราบใดที่คุณย้ายไฟล์ ibdata ด้วย โดยค่าเริ่มต้นเหล่านั้นอยู่ใน datadir ผู้ใช้ MySQL จะถูกเก็บไว้ในโฟลเดอร์ mysql ใน tablespace ของผู้ใช้
Derek Downey

2
ขั้นตอนนี้จะทำงานสำหรับการย้ายจาก Windows ไปยัง Linux หรือไม่
ypercubeᵀᴹ

2
@ TypoCubeᵀᴹขอโทษที่ใช้เวลานานกว่าสองปีในการตอบสนอง แต่มันจะช่วยให้ฉันมีใครบางคนพูดอย่างชัดเจนว่า "ใช่มันทำงานได้จาก Windows ถึง Linux" ในกรณีของฉันฉันไปจาก Windows Server 2012 R2จะCent OS (Red Hat 4.8.5-11) MySQL รุ่นที่เฉพาะเจาะจงเป็นมาเรีย DB 10.1 ตามที่กำหนดไว้ฉันหยุดทั้งบริการ mysql, ซิงค์ไดเรกทอรีข้อมูลและเมื่อเริ่มบริการ mysql บนเซิร์ฟเวอร์ใหม่ฐานข้อมูลทั้งหมดตารางฐานข้อมูลและผู้ใช้ฐานข้อมูลก็ไม่เสียหาย
WEBjuju

30

ตามคู่มือการศึกษาใบรับรอง MySQL 5.0บทที่ 32 มาตรา 32.3.4, หน้า 456,457 อธิบายถึงเงื่อนไขสำหรับความสะดวกในการพกพาไบนารีซึ่งนำออกมาดังต่อไปนี้:

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

สำหรับ MyISAM ความสามารถในการพกพาแบบไบนารี่หมายความว่าคุณสามารถคัดลอกไฟล์สำหรับตาราง MyISAM โดยตรงจากเซิร์ฟเวอร์ MySQL เครื่องหนึ่งไปยังอีกเครื่องหนึ่งในเครื่องอื่นและเซิร์ฟเวอร์ตัวที่สองจะสามารถเข้าถึงตารางได้

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

ตาราง MyISAM และพื้นที่ตาราง InnoDB เป็นไบนารีแบบพกพาจากโฮสต์หนึ่งไปอีกโฮสต์หนึ่งหากตรงตามเงื่อนไขสองข้อ:

  • เครื่องทั้งสองต้องใช้เลขคณิตเลขจำนวนเต็มสองส่วน
  • เครื่องทั้งสองต้องใช้รูปแบบทศนิยมของ IEEE ไม่เช่นนั้นตารางจะต้องไม่มีคอลัมน์จุดลอยตัว (FLOAT หรือ DOUBLE)

ในทางปฏิบัติทั้งสองเงื่อนไขมีข้อ จำกัด เล็กน้อย เลขจำนวนเต็มสองส่วนที่เติมเต็มและรูปแบบจุดลอยตัว IEEE เป็นบรรทัดฐานของฮาร์ดแวร์ที่ทันสมัย เงื่อนไขที่สามสำหรับการพกพาแบบไบนารีของ InnoDB คือคุณควรใช้ชื่อตัวพิมพ์เล็กสำหรับตารางและฐานข้อมูล นี่เป็นเพราะ InnoDB เก็บชื่อเหล่านี้ไว้ภายใน (ในพจนานุกรมข้อมูล) ในตัวพิมพ์เล็กบน Windows การใช้ชื่อตัวพิมพ์เล็กอนุญาตให้ไบนารีพกพาระหว่าง Windows และ Unix เพื่อบังคับให้ใช้ชื่อตัวพิมพ์เล็กคุณสามารถใส่บรรทัดต่อไปนี้ในไฟล์ตัวเลือก:

[mysqld]
lower_case_table_names=1

หากคุณกำหนดค่า InnoDB เพื่อใช้พื้นที่ตารางต่อตารางเงื่อนไขสำหรับการพกพาไบนารีจะถูกขยายเพื่อรวมไฟล์. ibd สำหรับตาราง InnoDB เช่นกัน (เงื่อนไขสำหรับพื้นที่ตารางที่ใช้ร่วมกันยังคงใช้ได้เนื่องจากมีพจนานุกรมข้อมูลที่เก็บข้อมูลเกี่ยวกับตาราง InnoDB ทั้งหมด)

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

มีสองวิธีที่สำคัญบนพื้นฐานของเอ็นจิ้นการจัดเก็บเพื่อย้ายแต่ละตาราง

สำหรับตัวอย่างที่กำหนดเราจะสมมติต่อไปนี้:

  1. datadir คือ / var / lib / mysql
  2. ฐานข้อมูลชื่อmydb
  3. ตารางในmydbฐานข้อมูลที่เรียกว่าmytable

ตาราง MyISAM

หาก mydb.mytable ใช้เครื่องมือจัดเก็บ MyISAM ตารางจะแสดงเป็นไฟล์แยกกันสามไฟล์

  1. /var/lib/mysql/mydb/mytable.frm (ไฟล์. frm)
  2. /var/lib/mysql/mydb/mytable.MYD (ไฟล์. MIY)
  3. /var/lib/mysql/mydb/mytable.MYI (ไฟล์. MII)

. frm มีโครงสร้างตาราง
. MYD มีข้อมูลตาราง
. MYI มีหน้าดัชนีตาราง

ไฟล์เหล่านี้ถูกใช้ซึ่งกันและกันเพื่อแสดงตารางจากจุดยืนเชิงตรรกะใน mysql เนื่องจากไฟล์เหล่านี้ไม่มีการเชื่อมโยงแบบโลจิคัลเพิ่มเติมให้ย้ายตารางจากเซิร์ฟเวอร์ DB หนึ่งไปยังเซิร์ฟเวอร์อื่น คุณสามารถทำได้แม้กระทั่งจากเซิร์ฟเวอร์ Windows ไปยัง Linux Server หรือ MacOS แน่นอนคุณสามารถปิด mysql และคัดลอกไฟล์ตาราง 3 คุณสามารถเรียกใช้ต่อไปนี้:

LOCK TABLES mydb.mytable READ;
SELECT SLEEP(86400);
UNLOCK TABLES;

ในหนึ่งเซสชันเพื่อเก็บตารางเป็นแบบอ่านอย่างเดียวและล็อคเป็นเวลา 24 ชั่วโมง หนึ่งวินาทีต่อมาดำเนินการคัดลอกในเซสชั่นอื่น ssh จากนั้นฆ่าเซสชัน mysql ด้วยการล็อค 24 ชั่วโมง คุณไม่จำเป็นต้องรอ 24 ชั่วโมง

ตาราง InnoDB

ขึ้นอยู่กับคำพูดที่กล่าวถึงข้างต้นจากหนังสือรับรองมีหลายปัจจัยที่ควบคุมวิธีการสำรองข้อมูลตาราง InnoDB ที่เฉพาะเจาะจง เพื่อความเรียบง่ายความชัดเจนและความกะทัดรัดเพียงใช้ mysqldump ของตารางที่ต้องการโดยใช้พารามิเตอร์ - ธุรกรรมเดี่ยวเพื่อให้มีการถ่ายโอนข้อมูล ณ จุดเวลาที่สมบูรณ์แบบของตาราง ไม่จำเป็นต้องใช้ความหมายของตัวเองด้วยความหมายของ InnoDB หากคุณต้องการเพียงหนึ่งตาราง คุณสามารถโหลด dumpfile นั้นไปยังเซิร์ฟเวอร์ MySQL ที่คุณเลือกได้

เนื่องจากคำถามสองข้อถูกรวมที่นี่ (jcolebrand): EDIT

หากคุณเต็มใจที่จะอยู่กับประสิทธิภาพของฐานข้อมูลช้าคุณสามารถดำเนินการชุด rsyncs จากเซิร์ฟเวอร์เก่า (ServerA) ไปยังเซิร์ฟเวอร์ใหม่ (ServerB) แม้ในขณะที่ mysql ยังคงทำงานบน ServerA

ขั้นตอนที่ 01) ติดตั้ง mysql รุ่นเดียวกันบน ServerB ที่ ServerA มี

ขั้นตอนที่ 02) ใน ServerA ให้เรียกใช้SET GLOBAL innodb_max_dirty_pages_pct = 0;จาก mysql และประมาณ 10 นาที (นี่จะล้างหน้าที่สกปรกจาก InnoDB Buffer Pool นอกจากนี้ยังช่วยให้ทำการปิด mysql ได้เร็วขึ้น) หากฐานข้อมูลของคุณคือ MyISAM ทั้งหมดคุณสามารถข้ามขั้นตอนนี้ได้

ขั้นตอนที่ 03) rsync --archive --verbose --stats --partial --progress --human-readable ServerA:/var/lib/mysql ServerB:/var/lib/mysql

ขั้นตอนที่ 04) ทำซ้ำขั้นตอนที่ 03 จนกระทั่ง rsync ใช้เวลาน้อยกว่า 1 นาที

ขั้นตอนที่ 05) service mysql stopใน ServerA

ขั้นตอนที่ 06) ดำเนินการ rsync อีกหนึ่งรายการ

ขั้นตอนที่ 07) scp ServerA:/etc/my.cnf ServerB:/etc/

ขั้นตอนที่ 08) service mysql startใน ServerB

ขั้นตอน 08) service mysql startบน ServerA (ไม่บังคับ)

ให้มันลอง !!!

ข้อแม้

คุณสามารถสร้างทาสการจำลองเช่นนี้ เพียงจำไว้ว่าต้องตั้งค่าเซิร์ฟเวอร์ - รหัสอย่างชัดเจนใน master / etc / my.cnf และหมายเลขอื่นสำหรับ server-id ใน slave /etc/my.cnf


29

คุณไม่จำเป็นต้องใช้ mysqldump ถ้าคุณย้ายสกีมาฐานข้อมูลทั้งหมดและคุณยินดีที่จะหยุดฐานข้อมูลแรก (ดังนั้นจึงสอดคล้องกันเมื่อมีการถ่ายโอน)

  1. หยุดฐานข้อมูล (หรือล็อค)
  2. ไปที่ไดเรกทอรีที่ไฟล์ข้อมูล mysql อยู่
  3. โอนย้ายโฟลเดอร์ (และเนื้อหา) ไปยังไดเรกทอรีข้อมูล mysql ของเซิร์ฟเวอร์ใหม่
  4. เริ่มสำรองฐานข้อมูล
  5. บนเซิร์ฟเวอร์ใหม่ออกคำสั่ง 'สร้างฐานข้อมูล'
  6. สร้างผู้ใช้ใหม่และให้สิทธิ์

ฉันจำไม่ได้ว่า mysqldump จัดการกับผู้ใช้และการอนุญาตหรือเพียงแค่ข้อมูล ... แต่แม้ว่ามันจะเป็นเช่นนั้นนี่เป็นวิธีที่เร็วกว่าการถ่ายโอนข้อมูลและการเรียกใช้ ฉันจะใช้เฉพาะที่ถ้าฉันต้องการถ่ายโอนฐานข้อมูล mysql แล้วใส่กลับเข้าไปใน RDBMS อื่น ๆ ถ้าฉันต้องการเปลี่ยนตัวเลือกการจัดเก็บ (innodb vs. myisam) หรือบางทีถ้าฉันกำลังเปลี่ยนข้อสำคัญของ mysql (แต่ ฉันคิดว่าฉันทำสิ่งนี้ระหว่าง 4 และ 5)


สิ่งนี้มีประสิทธิภาพมากขึ้นโดยเฉพาะถ้าเป็น sysadmin / DBA BTW mysqldump ใช้--all-databasesดัมพ์ mysql schema การเริ่มต้นใช้งาน mysql ในเครื่องถัดไปจะแสดงการอนุญาตที่คุณถ่ายโอนโฟลเดอร์ข้อมูลไปยังเครื่องอื่นด้วย MySQL รุ่นเดียวกัน (MySQL 5.5.x ถึง MySQL 5.5.x, MySQL 5.1.x ถึง MySQL 5.1.x, MySQL 5.0.x ถึง MySQL 5.0.x)
RolandoMySQLDBA

4
@ Joe ใช่mysqldumpจัดการกับผู้ใช้และการอนุญาตเนื่องจากสิ่งเหล่านี้ถูกเก็บไว้ภายในmysqlschema
Shlomi Noach

วิธีนี้มีประโยชน์อย่างยิ่งกับการโฮสต์บนคลาวด์เช่น AWS คุณสามารถหยุด mysql, unmount และแยกออกจากเซิร์ฟเวอร์ปัจจุบัน; แนบและเชื่อมต่อกับเซิร์ฟเวอร์ใหม่และเริ่ม mysql ไม่มีการคัดลอกโอเวอร์เฮดหากปริมาณยังคงอยู่ในเซิร์ฟเวอร์ฟาร์มเดียวกัน
LateralFractal

12

หากคุณต้องการย้ายตารางเฉพาะลอง:

mysqldump -u username -ppassword databasename tablename > databasename.tablename.sql

คุณสามารถระบุชื่อตารางเพิ่มเติมได้ในคำสั่งเดียวกัน เมื่อคำสั่งเสร็จสิ้นให้ย้ายไฟล์ databasename.tablename.sql ไปยังเซิร์ฟเวอร์อื่นจากนั้นกู้คืนโดยใช้:

mysql -u username -ppassword databasename < databasename.tablename.sql

โปรดทราบว่าไฟล์ .sql กลับถูกสร้างขึ้นโดยใช้mysqldumpโปรแกรมและเรียกคืนจะทำโดยตรงในMySQL


7
  1. หากคุณมีการเข้าถึง ssh คุณสามารถใช้ mysqldump จากบรรทัดคำสั่ง
  2. หากคุณไม่มีสิทธิ์เข้าถึง ssh แต่คุณมีสิทธิ์เข้าถึง phpMyAdmin คุณสามารถใช้เพื่อส่งออก / นำเข้า
  3. หากคุณไม่สามารถเข้าถึง phpMyAdmin มีสคริปต์ php ที่มีประโยชน์บางตัวที่จะถ่ายโอนข้อมูลและนำเข้า (อย่างไรก็ตามการพูดจากประสบการณ์ของฉันเองฉันไม่เคยพบสคริปต์ที่เชื่อถือได้เท่ากับ phpMyAdmin)

อาจมีความเป็นไปได้ที่คุณย้ายไฟล์ฐานข้อมูลจริง (สำหรับการติดตั้งของฉันจะอยู่ที่ / var / lib / mysql) แต่ฉันไม่แน่ใจว่ามันจะทำงานออกมาได้อย่างไร


5

คุณจะต้องหยุดทำงาน อาจต้องใช้เวลาสักครู่ขึ้นอยู่กับความเร็วเครือข่ายของคุณ ฉันจะสมมติว่าคุณใช้งาน MySQL บน Linux / Unix นี่คือกระบวนการที่ฉันใช้:

  1. หยุด mysql daemon บนโฮสต์ต้นทาง
  2. สร้างโฟลเดอร์ tmp บนโฮสต์เป้าหมายของคุณเพื่อรับไฟล์
  3. ใช้หน้าจอเพื่อสร้างเซสชันเชลล์ที่จะอยู่รอดหาก SSH ของคุณถูกตัดการเชื่อมต่อ
  4. ใช้rsyncเพื่อถ่ายโอนไฟล์ระหว่างโฮสต์ สิ่งที่ต้องการ: rsync -avhP source user @ Targethost: / path / to / folder /
  5. เรียกใช้กรณีทดสอบของคุณเพื่อให้แน่ใจว่าคุณจะไม่สูญเสียสิ่งใดในการถ่ายโอน

จากนั้นดำเนินการตามปกติเมื่อทำการติดตั้ง MySQL ในเครื่อง

* หมายเหตุ: คุณยังสามารถใช้พารามิเตอร์ -c พร้อม rsync เพื่อเพิ่มการตรวจสอบการถ่ายโอนได้อย่างไรก็ตามการดำเนินการนี้จะช้ามากขึ้นอยู่กับความเร็วของ CPU


4

ฉันสามารถยืนยันได้ว่าวิธีการของ DTest นั้นใช้ได้สำหรับการคัดลอกระหว่าง ubuntu และ osx

ในการคัดลอกฐานข้อมูลทั้งหมดโดยไม่ต้องทำการดัมพ์หรือที่คล้ายกัน:

ตรวจสอบให้แน่ใจว่าคุณมี mysql ที่สะอาดของ mysql (ติดตั้ง dmg ที่ดาวน์โหลดจาก mysql http://cdn.mysql.com/Downloads/MySQL-5.1/mysql-5.1.63-osx10.6-x86_64.dmg ), (มาก สำคัญ) ไม่เคยถูกเรียกใช้

คัดลอกเนื้อหา / var / lib / mysql / folder จากเครื่อง ubuntu ที่ด้านบนของ / usr / local / mysql / data / content บน mac ในการเข้าถึงโฟลเดอร์บนเครื่องอูบุนตูฉันต้องใช้ sudo เช่น:

sudo cp /var/lib/mysql /home/foouser/mysql_data_folder
sudo chown -R foouser /home/foouser/mysql_data_folder

ฉันคัดลอกโฟลเดอร์โดยใช้ scp

ก่อนที่คุณจะเริ่มคัดลอกโฟลเดอร์ mysql บน mac เพื่อให้แน่ใจว่าคุณจะไม่ทำอะไรผิดพลาด

หลังจากคัดลอกโฟลเดอร์แล้วให้ทำสิ่งต่อไปนี้บนเครื่อง mac:

sudo chown -R _mysql /usr/local/mysql/data/
sudo chgrp -R wheel /usr/local/mysql/data/
sudo chmod -R g+rx /usr/local/mysql/data/

เริ่มเซิร์ฟเวอร์ mysql เป็นครั้งแรก (จากบานหน้าต่างการตั้งค่าภายใต้ System Preferences-> mysql) ผู้ใช้และฐานข้อมูลทั้งหมดควรได้รับการตั้งค่าอย่างถูกต้อง

สิ่งนี้ทำงานกับ mysql 5.1.61 บน Ubuntu 64 บิต 11.10 และ mysql 5.1.63 บน osx lion (macbook pro)


4

ฉันคิดว่าคำตอบก่อนหน้านี้ทั้งหมดอาจใช้ได้ดี แต่ไม่ได้แก้ไขปัญหาของการตั้งชื่อฐานข้อมูลระหว่างการถ่ายโอน

นี่คือวิธีที่ฉันทำกับ bash:

คุณอาจใช้งานได้ดีrsyncกว่าscpและไม่บีบอัดไฟล์หากคุณทำเช่นนี้บ่อย

บนเซิร์ฟเวอร์ต้นทางของฉัน:

me@web:~$ d=members
me@web:~$ mysqldump $d | gzip > $d.sql.gz
me@web:~$ scp -i .ssh/yourkeynamehere $d.sql.gz $sbox:$d.sql.gz

บนเซิร์ฟเวอร์ปลายทางของฉัน:

me@sandbox:~$ d1=members
me@sandbox:~$ d2=members_sb
me@sandbox:~$ mysqladmin create $d2
me@sandbox:~$ cat $d1.sql.gz | gunzip |  mysql $d2

บนเครื่องทั้งสองเพื่อดูความคืบหน้า:

me@sandbox:~$ ls *.gz 
me@sandbox:~$ cat $d.sql.gz | gunzip |  less

ทั้งหมดนี้ถือว่าคุณมีไฟล์กำหนดค่า MySQLในโฮมไดเร็กตอรี่ของคุณบนทั้งสองเครื่องและตั้งค่าการอนุญาต:

$ echo "
[client]
user=drupal6
password=metoknow
host=ord-mysql-001-sn.bananas.com
[mysql]
database=nz_drupal" > .my.cnf
$ chmod 0600 ~/.my.cnf

3

คุณย้ายไปยังเซิร์ฟเวอร์ mysql อื่นหรือไม่ ถ้าเป็นเช่นนั้นใช้ส่งออกมัน

# mysqldump -u username -ppassword database_name > FILE.sql

mysqldump? นั่นคือเมื่อคุณจัดการกับข้อมูลจำนวนเล็กน้อย?
Oh Chin Boon

2
ฉันคิดว่าวันนี้เล็ก / ใหญ่ค่อนข้างเป็นส่วนตัว เมื่อฉันเห็นชื่อของคำถามที่ฉันคาดหวังว่าฐานข้อมูลจะมีขนาดใหญ่กว่า 20gb ให้ถือว่า "ใหญ่" ...
Aaron Bertrand

3

วิธีลินุกซ์ทั่วไป:

/etc/init.d/mysqld stop
rsync -avz source_files destination
vi /etc/my.cnf

แก้ไข datadir (และซ็อกเก็ต) สำหรับทั้ง mysqld และ mysqld_safe (ถ้ามี) เพื่อชี้ไปที่ตำแหน่งใหม่จากนั้น

/etc/init.d/mysql start

ฉันโพสต์สิ่งนี้เพราะไม่มีใครดูเหมือนจะทำรายการขั้นตอนจำนวนน้อยที่สุดในการทำสิ่งนี้และฉันรู้สึกว่ามันเป็นวิธีที่ง่ายที่สุดโดยส่วนตัว


2

บางทีนี่อาจเป็นวิธีที่ดีกว่าในการทำ:

รุ่น 1 : คัดลอกไฟล์ข้อมูล (MYISAM เท่านั้น)

ssh server1
service mysql stop
cd $mysql-data-dir
rsync -avz dirs-or-files server2:$mysql-data-dir
service mysql start

ssh server2 บริการเริ่ม mysql

  • หากไฟล์ฐานข้อมูลของคุณอ่านได้อย่างเดียวคุณอาจข้ามการหยุดเซิร์ฟเวอร์

เวอร์ชัน 2 : mysqldump

ติดตั้ง pigz - บนโปรเซสเซอร์ Xeon หรือ Opteron รุ่นใหม่โดยเฉพาะเมื่อคุณมี CPU 2 ตัวขึ้นไปมันเร็วกว่า gzip มาก

ssh server1 
mysqldump ... | pigz > backup-YYMDD.sql.gz
rsync backup-YYMDD.sql.gz server:location

ssh server2
pigz -dc location/backup-YYMDD.sql.gz | mysql ..

เวอร์ชัน 3 : master / slave + mysqldump / file-copy

In HA environment you should use the following trick:
setup slave server & do all backups from it
before backups - do "slave stop"; 
then do version 1 or version 2

สคริปต์:

touch full.start
mysqladmin -h slave-db stop-slave
echo "show slave status \G" | mysql -h slave-db > FULL/comfi-$NOW.master-position
/usr/bin/mysqldump -h slave-db --default-character-set=utf8 -A --opt --skip-lock-tables | pigz > "FULL/XXXX-$NOW.sql.gz"
mysqladmin -h slave-db start-slave
touch full.end

ln -fs "FULL/XXXX-$NOW.sql.gz" FULL.sql.gz

PS:

เพื่อคัดลอกตารางขนาดเล็กใช้:

ssh server1 ตาราง mysqldump schema ssh server2 mysql schema


2

ฉันขอแนะนำสองขั้นตอนง่าย ๆ ในการถ่ายโอนฐานข้อมูลทั้งหมดจากเซิร์ฟเวอร์หนึ่งไปยังอีกเซิร์ฟเวอร์หนึ่ง

ขั้นตอนที่ 1 : ทำเต็มรูปแบบในการสำรองข้อมูลของฐานข้อมูลในเซิร์ฟเวอร์ต้นทางโดยใช้mysqldump

ขั้นตอนที่ 2 : คุณสามารถใช้คำสั่งrsyncเพื่อถ่ายโอนฐานข้อมูลทั้งหมดไปยังเซิร์ฟเวอร์ปลายทาง

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