Як ми можемо відновити базу даних 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 ...
в ньому, що порушує мій імпорт. Редагувати: Oracle в основному ігнорує помилку .
Я великий шанувальник дампа, редагування та вставки. але вам не потрібно відкривати текстовий файл (dump-файл), щоб змінити його (це особливо корисно, коли він має кілька мільйонів рядків). якщо ви хочете скинути базу даних MYDATABASE
.
mysqldump MYDATABASE > mydump.sql
потім використовуйте sed для заміни старої назви бази даних на нову подібну
sed -i 's/MYDATABASE/MYNEWDATABASE/g' mydump.sql
тоді ви можете просто створити нову базу даних та імпортувати її знову, і вона створить усі таблиці в новій базі даних MYNEWDATABASE '
mysqladmin create MYNEWDATABASE
mysql MYNEWDATABASE < mydump.sql
Редагувати: Як наголосили деякі приємні люди в розділі коментарів, це може бути небезпечно, якщо деякі дані також будуть змінені цим вище, тож, щоб визначити способи цього уникнути.
1) Майте за це на смітнику, перш ніж змінити його, як це.
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
# потенційно безпечніше редагування пари. мій дамп бази даних не містить жодних операцій USE або CREATE DATABASE, але ім'я db міститься в sql коментарях, переглядах та тригерах (MySQL 5.7). Це НЕ замінює ім'я бази даних у коментарях, але вони не впливають на отриману базу даних. Це добре спрацювало для мене.
Якщо файл , що ви маєте на руці , і ви маніпулюєте його з оболонки / консолі, я хотів би використовувати , 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 не містила CREATE 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, коли я включив її.