MySQL: een MySQL-database klonen op dezelfde MySql-instantie

Ik zou graag een script willen schrijven dat mijn huidige database sitedb1kopieert naar sitedb2op dezelfde mysql database-instantie. Ik weet dat ik de sitedb1 naar een sql-script kan dumpen:

mysqldump -u root -p sitedb1 >~/db_name.sql

en importeer het dan in sitedb2.
Is er een eenvoudigere manier, zonder de eerste database naar een sql-bestand te dumpen?


Antwoord 1, autoriteit 100%

Zoals de handleiding zegt in Databases kopiërenkan de dump rechtstreeks naar de mysql-client sturen:

mysqldump db_name | mysql new_db_name

Als je MyISAM gebruikt, zoude bestanden kunnen worden gekopieerd, maar ik zou het niet aanraden. Het is een beetje onbetrouwbaar.

Geïntegreerd vanuit verschillende goede andere antwoorden

Zowel mysqldumpals mysqlcommando’s accepteren opties voor het instellen van verbindingsdetails (en nog veel meer), zoals:

mysqldump -u <user name> --password=<pwd> <original db> | mysql -u <user name> -p <new db>

Als de nieuwe database nog niet bestaat, moet u deze ook van tevoren maken (bijv. met echo "create database new_db_name" | mysql -u <dbuser> -p).

p>


Antwoord 2, autoriteit 21%

MySQL-hulpprogramma’s gebruiken

De MySQL-hulpprogramma’s bevatten de mooie tool mysqldbcopydie standaard een DB kopieert, inclusief alle gerelateerde objecten (“tabellen, weergaven, triggers, gebeurtenissen, procedures, functies en toewijzingen op databaseniveau”) en gegevens van de ene DB-server naar dezelfde of naar een andere DB-server. Er zijn veel opties beschikbaar om aan te passen wat er daadwerkelijk wordt gekopieerd.

Dus, om de vraag van de OP te beantwoorden:

mysqldbcopy \
    --source=root:your_password@localhost \
    --destination=root:your_password@localhost \
    sitedb1:sitedb2

Antwoord 3, autoriteit 6%

De beste en makkelijke manier is om deze commando’s in je terminal in te voeren en de rechten voor de rootgebruiker in te stellen. Werkt voor mij..!

:~$> mysqldump -u root -p db1 > dump.sql
:~$> mysqladmin -u root -p create db2
:~$> mysql -u root -p db2 < dump.sql

Antwoord 4, autoriteit 5%

mysqladmin create DB_name -u DB_user --password=DB_pass && \
        mysqldump -u DB_user --password=DB_pass DB_name | \
        mysql     -u DB_user --password=DB_pass -h DB_host DB_name

Antwoord 5, autoriteit 4%

U moet de opdracht uitvoeren vanaf terminal / opdrachtprompt.

mysqldump -u <user name> -p <pwd> <original db> | mysql -u <user name> <pwd> <new db>

bijv.: mysqldump -u root test_db1 | mysql -u root test_db2

Dit kopieert test_db1 naar test_db2 en verleent de toegang tot ‘root’@’localhost’


Antwoord 6, autoriteit 3%

Je zou kunnen gebruiken (in pseudocode):

FOREACH tbl IN db_a:
    CREATE TABLE db_b.tbl LIKE db_a.tbl;
    INSERT INTO db_b.tbl SELECT * FROM db_a.tbl;

De reden dat ik de CREATE TABLE … SELECT … syntaxis niet gebruik, is om indexen te behouden. Dit kopieert natuurlijk alleen tabellen. Aanzichten en procedures worden niet gekopieerd, hoewel het wel op dezelfde manier kan.

Zie TABEL MAKEN.


Antwoord 7, autoriteit 2%

Maak eerst de dubbele database:

CREATE DATABASE duplicateddb;

Zorg ervoor dat de rechten enz. allemaal aanwezig zijn en:

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

Antwoord 8

Een eenvoudige manier om dit te doen als u phpmyadminheeft geïnstalleerd:

Ga naar uw database, selecteer het tabblad “bewerking” en u ziet het blok “database kopiëren naar”. Gebruik het en je kunt de database kopiëren.


Antwoord 9

Je kunt zoiets als het volgende doen:

mysqldump -u[username] -p[password] database_name_for_clone 
 | mysql -u[username] -p[password] new_database_name

Antwoord 10

Deze verklaring is toegevoegd in MySQL 5.1.7, maar werd gevaarlijk bevonden en werd verwijderd in MySQL 5.1.23. Het was bedoeld om het upgraden van databases van vóór 5.1 mogelijk te maken om de codering te gebruiken die in 5.1 is geïmplementeerd voor het toewijzen van databasenamen aan databasedirectorynamen. Het gebruik van deze instructie kan echter leiden tot verlies van database-inhoud, daarom is deze verwijderd. Gebruik RENAME DATABASE niet in eerdere versies waarin het aanwezig is.

Als u de taak van het upgraden van databasenamen met de nieuwe codering wilt uitvoeren, gebruikt u in plaats daarvan ALTER DATABASE db_name UPGRADE DATA DIRECTORY NAME: http://dev.mysql.com/doc/refman/5.1/en/alter-database.html


Antwoord 11

Naast Gregs antwoord, is dit de gemakkelijkste en snelste manier als de new_db_namedat niet doet bestaat nog niet:

echo "create database new_db_name" | mysql -u <user> -p <pwd> 
mysqldump -u <user> -p <pwd> db_name | mysql -u <user> -p <pwd> new_db_name

Antwoord 12

Als u triggers in uw oorspronkelijke database heeft, kunt u de fout ‘Trigger bestaat al’ vermijden door een vervanging voor de import door te sturen:

mysqldump -u olddbuser -p -d olddbname | sed "s/`olddbname`./`newdbname`./" | mysql -u newdbuser -p -D newdbname

Antwoord 13

Mijndumper gebruiken

sudo apt install mydumper

Dump genereren

mydumper --user=YOUR_USER --password=YOUR_PASSWORD -B YOUR_CURRENT_DB \ 
         --triggers --routines --events --outputdir YOUR_OUTPUT_DIR

Dump laden

myloader --user=YOUR_USER --password=YOUR_PASSWORD --database=YOUR_NEW_DB \ 
         --directory=YOUR_OUTPUT_DIR

Other episodes