เราจะกู้คืนฐานข้อมูล mysql ด้วยชื่อที่แตกต่างจากไฟล์ mysqldump ได้อย่างไร ฉันไม่ต้องการเปิดไฟล์ดัมพ์แล้วแก้ไขมัน มีวิธีอื่นที่ดีกว่านี้ไหม?
เราจะกู้คืนฐานข้อมูล mysql ด้วยชื่อที่แตกต่างจากไฟล์ mysqldump ได้อย่างไร ฉันไม่ต้องการเปิดไฟล์ดัมพ์แล้วแก้ไขมัน มีวิธีอื่นที่ดีกว่านี้ไหม?
คำตอบ:
คุณสามารถปล่อยให้ 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
ให้มันลอง !!!
ALTER DATABASE ... CHARACTER SET ...
อยู่ในนั้นซึ่งทำลายการนำเข้าของฉัน แก้ไข: ออราเคิลเป็นพื้นโดยไม่สนใจข้อผิดพลาด
ฉันเป็นแฟนตัวยงของการแก้ไขและการแทรก แต่คุณไม่จำเป็นต้องเปิดไฟล์ข้อความ (ไฟล์ดัมพ์) เพื่อเปลี่ยน (นี่เป็นประโยชน์โดยเฉพาะอย่างยิ่งเมื่อมันยาวหลายล้านเส้น 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 ปี
sed -i 's/MYDATABASE/MYNEWDATABASE/g' mydump.sql
) ตรวจสอบการเกิดขึ้นทั้งหมดของ MYDATABASE ด้วยcat mydump.sql | grep "MYDATABASE"
เพื่อให้แน่ใจว่ามีเพียงชื่อฐานข้อมูลที่ถูกเปลี่ยนแปลงข้อมูลอื่น ๆ จะยังคงไม่ถูกแตะต้อง
sed -i 's/`MYDATABASE`/`MYNEWDATABASE`/g' mydump.sql
# การแก้ไข Steam ที่อาจปลอดภัยกว่า ดัมพ์ฐานข้อมูลของฉันไม่มีคำสั่ง USE หรือ CREATE DATABASE แต่ชื่อ db อยู่ในความคิดเห็น sql มุมมองและทริกเกอร์ (MySQL 5.7) สิ่งนี้ไม่ได้แทนที่ชื่อฐานข้อมูลในความคิดเห็น แต่จะไม่มีผลกับฐานข้อมูลที่เป็นผลลัพธ์ นี้ทำงานได้ดีสำหรับฉัน.
ฉันทำสิ่งนี้ครั้งหนึ่งนานมาแล้ว
เมื่อคุณส่งออกข้อมูลทั้งหมดของคุณมีตัวเลือกเพื่อตั้งชื่อฐานข้อมูลในจุดเริ่มต้นของไฟล์บางอย่างเป็น: "ใช้ฐานข้อมูล x"
ดังนั้นคุณสามารถเปลี่ยนการประกาศนี้
ถ้าแฟ้มคือสิ่งที่คุณมีอยู่ในมือและคุณจะจัดการได้จากเปลือก / คอนโซลผมจะใช้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
ไม่ได้ใช้
--no-create-db
และไม่มีหรือ--database
--databases
หากคุณถ่ายโอนข้อมูลโดยใช้กฎสองข้อต่อไปนี้:
--databases
, --database
และเพียงแค่ใส่ชื่อฐานข้อมูลในตอนท้ายของคำสั่งโดยไม่มีตัวเลือกเหล่านี้--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
--no-create-db
และไม่มีหรือ--database
--databases
นี่คือเชลล์สคริปต์ที่จะช่วยให้คุณเพิ่มคำต่อท้าย / คำต่อท้ายชื่อสกีมาทั้งหมดได้ทันที
-Ddb2
ไม่ควรมียัติภังค์อยู่ข้างหน้า อย่างน้อยฉันได้รับข้อผิดพลาดทางไวยากรณ์ของ MySQL เมื่อฉันรวมมันไว้