กู้คืนฐานข้อมูล mysql ด้วยชื่ออื่น


41

เราจะกู้คืนฐานข้อมูล mysql ด้วยชื่อที่แตกต่างจากไฟล์ mysqldump ได้อย่างไร ฉันไม่ต้องการเปิดไฟล์ดัมพ์แล้วแก้ไขมัน มีวิธีอื่นที่ดีกว่านี้ไหม?

คำตอบ:


58

คุณสามารถปล่อยให้ mysqldump สร้างดัมพ์ในลักษณะที่ไม่ได้สร้างหรือเลือกฐานข้อมูล

ตัวอย่าง: คุณกำลังดัมพ์ฐานข้อมูล db1 และโหลดลงในฐานข้อมูล db2

สิ่งนี้จะใส่ใน CREATE DATABASE และคำสั่ง USE ในดัมพ์

mysqldump -u... -p... --routines --triggers --databases db1 > /root/db1.sql

สิ่งนี้จะไม่ใส่ใน CREATE DATABASE และคำสั่ง USE ในการถ่ายโอนข้อมูล ( นี่คือสิ่งที่คุณต้องการ )

mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql

คุณสามารถโหลดลงในฐานข้อมูลอื่น (เช่น db2) ด้วยวิธีใดวิธีหนึ่งจากสี่ (4) วิธี:

ตัวเลือกที่ 1

$ mysqldump -u... -p... --routines --triggers db1 | mysql -u... -p... -A -Ddb2

ตัวเลือก 2

$ mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql
$ mysql -u... -p... -A -Ddb2 < /root/db1.sql

ตัวเลือก 3

$ mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql
$ mysql -u... -p... -A -Ddb2
mysql> source /root/db1.sql

ตัวเลือก 4

$ mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql
$ mysql -u... -p... -A
mysql> use db2
mysql> source /root/db1.sql

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


ในกรณีที่คนอื่นต่อสู้กับเรื่องนี้-Ddb2ไม่ควรมียัติภังค์อยู่ข้างหน้า อย่างน้อยฉันได้รับข้อผิดพลาดทางไวยากรณ์ของ MySQL เมื่อฉันรวมมันไว้
gwg

ดูเหมือนจะใช้งานไม่ได้ การถ่ายโอนข้อมูลของฉันไม่มีฐานข้อมูล CREATE หรือ USE แต่ยังมีALTER DATABASE ... CHARACTER SET ...อยู่ในนั้นซึ่งทำลายการนำเข้าของฉัน แก้ไข: ออราเคิลเป็นพื้นโดยไม่สนใจข้อผิดพลาด
mpen

5

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

mysqldump MYDATABASE > mydump.sql

จากนั้นใช้ sed เพื่อแทนที่ชื่อฐานข้อมูลเก่าด้วยชื่อใหม่เช่นนี้

sed -i 's/MYDATABASE/MYNEWDATABASE/g' mydump.sql

จากนั้นคุณสามารถสร้างฐานข้อมูลใหม่และนำเข้าอีกครั้งและมันจะสร้างตารางทั้งหมดด้วยใน databae ใหม่ MYNEWDATABASE '

mysqladmin create MYNEWDATABASE

mysql MYNEWDATABASE < mydump.sql

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

1) Grep สำหรับเรื่องนี้ในการถ่ายโอนข้อมูลก่อนที่คุณจะเปลี่ยนเช่นนี้

cat mydump.sql | grep "MYDATABASE"

และ

2) เราสามารถเพิ่มบาง `เพื่อทำให้ปลอดภัยยิ่งขึ้นเช่นนี้:

sed -i 's/`MYDATABASE`/`MYNEWDATABASE`/g' mydump.sql

หากใครมีคำแนะนำที่เป็นรูปธรรมฉันยินดีที่จะแก้ไขคำตอบของฉันในอีก 4 ปี


ฉันคิดว่าคำถามเกี่ยวกับการกู้คืนฐานข้อมูล enitre แต่มีชื่ออื่นไม่เพียงคัดลอกหนึ่งตารางภายในฐานข้อมูลที่มีอยู่
Michael Green

3
ส่วนที่จำเป็นต้องใช้
Steve Buzonas

10
คำสั่งนี้เป็นความคิดที่ไม่ดีและฉันจะลงคะแนนถ้าฉันทำได้ หากคุณต้องการเปลี่ยนสตริงอย่างน้อยต้องตรงกับบรรทัด CREATE TABLE และ USE เพื่อให้คุณไม่ต้องแทนที่ข้อมูลอื่นใด
bksunday

1
ก่อนที่จะรันคำสั่ง sed ( sed -i 's/MYDATABASE/MYNEWDATABASE/g' mydump.sql) ตรวจสอบการเกิดขึ้นทั้งหมดของ MYDATABASE ด้วยcat mydump.sql | grep "MYDATABASE"เพื่อให้แน่ใจว่ามีเพียงชื่อฐานข้อมูลที่ถูกเปลี่ยนแปลงข้อมูลอื่น ๆ จะยังคงไม่ถูกแตะต้อง
Rafaf Tahsin

1
sed -i 's/`MYDATABASE`/`MYNEWDATABASE`/g' mydump.sql # การแก้ไข Steam ที่อาจปลอดภัยกว่า ดัมพ์ฐานข้อมูลของฉันไม่มีคำสั่ง USE หรือ CREATE DATABASE แต่ชื่อ db อยู่ในความคิดเห็น sql มุมมองและทริกเกอร์ (MySQL 5.7) สิ่งนี้ไม่ได้แทนที่ชื่อฐานข้อมูลในความคิดเห็น แต่จะไม่มีผลกับฐานข้อมูลที่เป็นผลลัพธ์ นี้ทำงานได้ดีสำหรับฉัน.
Jonathan

3

ฉันทำสิ่งนี้ครั้งหนึ่งนานมาแล้ว

เมื่อคุณส่งออกข้อมูลทั้งหมดของคุณมีตัวเลือกเพื่อตั้งชื่อฐานข้อมูลในจุดเริ่มต้นของไฟล์บางอย่างเป็น: "ใช้ฐานข้อมูล x"

ดังนั้นคุณสามารถเปลี่ยนการประกาศนี้


3

ถ้าแฟ้มคือสิ่งที่คุณมีอยู่ในมือและคุณจะจัดการได้จากเปลือก / คอนโซลผมจะใช้sedในการทำเปลี่ยนสตริงบนเส้นที่เริ่มต้นด้วยCREATE DABATASE, CREATE TABLE, USEและ optionnally --(ความคิดเห็น mysqldump)

การแทนที่ชื่อ db บนบรรทัดที่ตรงกับสร้างฐานข้อมูล, สร้างตาราง, ใช้และข้อคิดเห็น mysqldump

dbfile="yoursqldumpfile.sql";
dbname="current_db_name";
dbnewname="new_db_name";
dbnewfile="/tmp/$dbnewname.sql";
cat $dbfile | sed "/^CREATE DATABASE/ s=$dbname=$dbnewname=" | sed "/^CREATE TABLE/ s=$dbname=$dbnewname=" | sed "/^USE / s=$dbname=$dbnewname=" | sed "/^-- / s=$dbname=$dbnewname=" > $dbnewfile


แน่นอนเช่นเดียวกับคำตอบมากมายที่กล่าวถึงมันจะง่ายกว่าถ้าการสำรอง mysqldump ไม่มี CREAT DATABASE และบรรทัด USE ความหมายตัวเลือก--all-databases, --databasesหรือรุ่นที่สั้นของพวกเขา-Aหรือ-Bไม่ได้ใช้


ใน MySQL 5.7 mysqldump มีชื่อฐานข้อมูลในทริกเกอร์และมุมมองที่แม้จะมี--no-create-dbและไม่มีหรือ--database --databases
Jonathan

2

หากคุณถ่ายโอนข้อมูลโดยใช้กฎสองข้อต่อไปนี้:

  1. อย่าใช้ตัวเลือกเช่น--databases, --databaseและเพียงแค่ใส่ชื่อฐานข้อมูลในตอนท้ายของคำสั่งโดยไม่มีตัวเลือกเหล่านี้
  2. รวมถึงตัวเลือก --no-create-db

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

mysqldump  --no-create-db old_db_name --single-transaction --compress --order-by-primary --host old_db_host -u old_db_user -pOld_db_password | mysql --host new_host -u new_user -pnewpassword new_db_name

ใน MySQL 5.7 mysqldump มีชื่อฐานข้อมูลในทริกเกอร์และมุมมองที่แม้จะมี--no-create-dbและไม่มีหรือ--database --databases
Jonathan

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