ทำซ้ำฐานข้อมูล MySQL ทั้งหมด


92

เป็นไปได้ไหมที่จะทำซ้ำฐานข้อมูล MySQL ทั้งหมดบนเซิร์ฟเวอร์ linux

ฉันรู้ว่าฉันสามารถใช้การส่งออกและนำเข้าได้ แต่ฐานข้อมูลเดิมมีขนาด> 25MB ดังนั้นจึงไม่เหมาะ

เป็นไปได้หรือไม่โดยใช้ mysqldump หรือทำซ้ำไฟล์ฐานข้อมูลโดยตรง

คำตอบ:


177

ขั้นแรกให้สร้างฐานข้อมูลที่ซ้ำกัน:

CREATE DATABASE duplicateddb;

ตรวจสอบให้แน่ใจว่าผู้ใช้และสิทธิ์อยู่ในตำแหน่งและ:

 mysqldump -u admin -p originaldb | mysql -u backup -pPassword duplicateddb; 

29
ฉันไม่คิดว่าควรมีช่องว่างระหว่าง "-p" และ "รหัสผ่าน" ในส่วนที่ 2 ของบรรทัดคำสั่งที่ 2 ของคุณ

16
ไม่ควรมีที่ว่าง! คำตอบถูกต้องเช่นนี้ หน้า man mysql กล่าวว่า: --password [= password], -p [password] รหัสผ่านที่จะใช้เมื่อเชื่อมต่อกับเซิร์ฟเวอร์ หากคุณใช้แบบฟอร์มตัวเลือกแบบสั้น (-p) คุณจะไม่มีช่องว่างระหว่างตัวเลือกและรหัสผ่าน หากคุณละเว้นค่ารหัสผ่านตามตัวเลือก - รหัสผ่านหรือ -p บนบรรทัดคำสั่ง mysql จะแจ้งให้หนึ่ง การระบุรหัสผ่านบนบรรทัดคำสั่งควรถือว่าไม่ปลอดภัย ดูหัวข้อ 6.1.2.1 "คำแนะนำสำหรับผู้ใช้ปลายทางสำหรับ P ...
nils petersohn

2
โปรดทราบว่า mysqldump สำรองทริกเกอร์ตามค่าเริ่มต้น แต่ไม่ใช่โพรซีเดอร์ที่เก็บไว้เพิ่ม--routinesเป็นตัวเลือกสำหรับกรณีนี้
LinuxDevOps

1
หากคุณทำเช่นนี้และคุณไม่ต้องการให้รหัสผ่าน MySQL ของผู้ใช้รายนี้มีอยู่ในประวัติ bash ให้แก้ไขออกจาก~/.bash_historyไฟล์ของคุณหลังจากดำเนินการแล้ว หรือคุณยังสามารถส่งออกผลมาจากคำสั่งแรกไปยังแฟ้มชั่วคราวและดำเนินการต่อไปหลังจากที่มัน mysql -p -u admin duplicatedb < temporaryfile.sql(ซึ่งจะแจ้งให้คุณด้วยรหัสผ่าน)
Mike

1
คำตอบนี้ใช้ได้ผลอย่างแน่นอน แต่คำถามระบุว่า "ฉันรู้ว่าฉันสามารถใช้การส่งออกและนำเข้าได้ แต่ฐานข้อมูลดั้งเดิม> 25MB จึงไม่เหมาะ" และสิ่งที่คำตอบนี้แนะนำคือการส่งออกและนำเข้าโดยทั่วไป
el.pescado

17

ไปยังเซิร์ฟเวอร์ระยะไกล

mysqldump mydbname | ssh host2 "mysql mydbcopy"

ไปยังเซิร์ฟเวอร์ภายใน

mysqldump mydbname | mysql mydbcopy

ข้อผิดพลาด 1064 (42000): คุณมีข้อผิดพลาดในไวยากรณ์ SQL ของคุณสวัสดีแสดงข้อผิดพลาดขณะใช้คำสั่งในเซิร์ฟเวอร์ภายในโปรดช่วย
amit_game


5

บางครั้งฉันทำ mysqldump และไพพ์เอาต์พุตไปยังคำสั่ง mysql อื่นเพื่ออิมพอร์ตลงในฐานข้อมูลอื่น

mysqldump --add-drop-table -u wordpress -p wordpress | mysql -u wordpress -p wordpress_backup

ฉันได้รับข้อผิดพลาดว่าไม่มีฐานข้อมูลปลายทางเมื่อฉันใช้สิ่งนี้ ดังนั้นคุณต้องสร้างบรรทัดฐานข้อมูลด้วย
blak3r

3

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

mysqldump -u user -p'password' db-name | ssh user@some_far_place.com mysql -u user -p'password' db-name

ไม่มีช่องว่างระหว่าง -p [รหัสผ่าน]


1
คุณช่วยเพิ่มคำอธิบายวิธีการทำงานเช่นการใช้ท่อได้หรือไม่?
kalyfe

1

นี่คือไฟล์ windows bat ที่ฉันเขียนซึ่งรวมคำแนะนำของ Vincent และ Pauls จะแจ้งผู้ใช้สำหรับชื่อต้นทางและปลายทาง

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

:: Creates a copy of a database with a different name.
:: User is prompted for Src and destination name.
:: Fair Warning: passwords are passed in on the cmd line, modify the script with -p instead if security is an issue.
:: Uncomment the rem'd out lines if you want script to prompt for database username, password, etc.

:: See also: http://stackoverflow.com/questions/1887964/duplicate-entire-mysql-database

@set MYSQL_HOME="C:\sugarcrm\mysql\bin"
@set mysqldump_exec=%MYSQL_HOME%\mysqldump
@set mysql_exec=%MYSQL_HOME%\mysql
@set SRC_PORT=3306
@set DEST_PORT=3306
@set USERNAME=TODO_USERNAME
@set PASSWORD=TODO_PASSWORD

:: COMMENT any of the 4 lines below if you don't want to be prompted for these each time and use defaults above.
@SET /p USERNAME=Enter database username: 
@SET /p PASSWORD=Enter database password: 
@SET /p SRC_PORT=Enter SRC database port (usually 3306): 
@SET /p DEST_PORT=Enter DEST database port: 

%MYSQL_HOME%\mysql --user=%USERNAME% --password=%PASSWORD% --port=%DEST_PORT% --execute="show databases;"
@IF NOT "%ERRORLEVEL%" == "0" GOTO ExitScript

@SET /p SRC_DB=What is the name of the SRC Database:  
@SET /p DEST_DB=What is the name for the destination database (that will be created):  

%mysql_exec% --user=%USERNAME% --password=%PASSWORD% --port=%DEST_PORT% --execute="create database %DEST_DB%;"
%mysqldump_exec% --add-drop-table --user=%USERNAME% --password=%PASSWORD% --port=%SRC_PORT% %SRC_DB% | %mysql_exec% --user=%USERNAME% --password=%PASSWORD% --port=%DEST_PORT% %DEST_DB%
@echo SUCCESSFUL!!!
@GOTO ExitSuccess

:ExitScript
@echo "Failed to copy database"
:ExitSuccess

ตัวอย่างผลลัพธ์:

C:\sugarcrm_backups\SCRIPTS>copy_db.bat
Enter database username: root
Enter database password: MyPassword
Enter SRC database port (usually 3306): 3308
Enter DEST database port: 3308

C:\sugarcrm_backups\SCRIPTS>"C:\sugarcrm\mysql\bin"\mysql --user=root --password=MyPassword --port=3308 --execute="show databases;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sugarcrm_550_pro   |
| sugarcrm_550_ce    |
| sugarcrm_640_pro   |
| sugarcrm_640_ce    |
+--------------------+
What is the name of the SRC Database:  sugarcrm
What is the name for the destination database (that will be created):  sugarcrm_640_ce

C:\sugarcrm_backups\SCRIPTS>"C:\sugarcrm\mysql\bin"\mysql --user=root --password=MyPassword --port=3308 --execute="create database sugarcrm_640_ce;"

C:\sugarcrm_backups\SCRIPTS>"C:\sugarcrm\mysql\bin"\mysqldump --add-drop-table --user=root --password=MyPassword --port=3308 sugarcrm   | "C:\sugarcrm\mysql\bin"\mysql --user=root --password=MyPassword --port=3308 sugarcrm_640_ce
SUCCESSFUL!!!

1

สิ่งนี้ใช้ไม่ได้กับ InnoDB ใช้วิธีแก้ปัญหานี้เฉพาะเมื่อคุณพยายามคัดลอกฐานข้อมูล MyISAM

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

เช่น

สำรอง:

# mysqlhotcopy -u root -p password db_name /path/to/backup/directory

คืนค่า:

cp /path/to/backup/directory/* /var/lib/mysql/db_name

mysqlhotcopyยังสามารถถ่ายโอนไฟล์ผ่าน SSH (scp) และอาจตรงไปยังไดเร็กทอรีฐานข้อมูลที่ซ้ำกัน

เช่น

# mysqlhotcopy -u root -p password db_name /var/lib/mysql/duplicate_db_name


0

สิ่งนี้ใช้ได้ผลสำหรับฉันด้วยพรอมต์คำสั่งจาก OUTSIDE mysql shell:

# mysqldump -u root -p password db1 > dump.sql
# mysqladmin -u root -p password create db2
# mysql -u root -p password db2 < dump.sql

นี่เป็นวิธีที่ดีที่สุดสำหรับฉัน หากซิป "dump.sql" คุณสามารถจัดเก็บเป็นข้อมูลสำรองแบบบีบอัดได้ เย็น! สำหรับฐานข้อมูล 1GB ที่มีตาราง Innodb ใช้เวลาประมาณหนึ่งนาทีในการสร้าง "dump.sql" และประมาณสามนาทีในการถ่ายโอนข้อมูลไปยัง DB db2 ใหม่

การคัดลอกไดเร็กทอรี db แบบตรง (mysql / data / db1) ไม่ได้ผลสำหรับฉันฉันเดาว่าเป็นเพราะตาราง InnoDB


-2

กาลครั้งหนึ่งใน MySQL คุณสามารถคัดลอกไฟล์ตารางทั้งหมดไปยังไดเร็กทอรีอื่นในแผนผัง mysql

mysql cli - สร้างฐานข้อมูล db2

ลินุกซ์คลิ - cp db1 db2


ที่ใช้ได้เฉพาะกับ MyISAM ใช่ไหม? วันเวลาที่เลวร้ายเหล่านั้นหายไป
Laurenz Albe

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