mysql - umbenennen - rename database postgres




Wie kann ich eine MySQL-Datenbank schnell umbenennen(Schemaname ändern)? (20)

Das MySQL-Handbuch bei MySQL deckt dies ab.

Normalerweise speichere ich einfach die Datenbank und importiere sie erneut mit einem neuen Namen. Dies ist keine Option für sehr große Datenbanken. Anscheinend RENAME {DATABASE | SCHEMA} db_name TO new_db_name; RENAME {DATABASE | SCHEMA} db_name TO new_db_name; MySQL .

Dies muss mit InnoDB funktionieren, das Dinge sehr anders speichert als MyISAM .


Der einfache Weg

Wechseln Sie in das Datenbankverzeichnis:

cd /var/lib/mysql/

Schalte MySQL herunter ... Das ist wichtig!

/etc/init.d/mysql stop

Okay, dieser Weg funktioniert nicht für InnoDB oder BDB-Datenbanken.

Datenbank umbenennen:

mv old-name new-name

... oder der Tisch ...

cd database/

mv old-name.frm new-name.frm

mv old-name.MYD new-name.MYD

mv old-name.MYI new-name.MYI

Starten Sie MySQL neu

/etc/init.d/mysql start

Erledigt...

OK, dieser Weg funktioniert nicht mit InnoDB oder BDB Datenbanken. In diesem Fall müssen Sie die Datenbank sichern und erneut importieren.


Das ist was ich benutze:

$ mysqldump -u root -p olddb >~/olddb.sql
$ mysql -u root -p
mysql> create database newdb;
mysql> use newdb
mysql> source ~/olddb.sql
mysql> drop database olddb;

Die gespeicherte Prozedur von TodoInTX funktionierte für mich nicht ganz. Hier ist mein Stich:

-- stored procedure rename_db: Rename a database my means of table copying.
-- Caveats: 
-- Will clobber any existing database with the same name as the 'new' database name.
-- ONLY copies tables; stored procedures and other database objects are not copied.
-- Tomer Altman ([email protected])

delimiter //
DROP PROCEDURE IF EXISTS rename_db;
CREATE PROCEDURE rename_db(IN old_db VARCHAR(100), IN new_db VARCHAR(100))
BEGIN
    DECLARE current_table VARCHAR(100);
    DECLARE done INT DEFAULT 0;
    DECLARE old_tables CURSOR FOR select table_name from information_schema.tables where table_schema = old_db;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

    SET @output = CONCAT('DROP SCHEMA IF EXISTS ', new_db, ';'); 
    PREPARE stmt FROM @output;
    EXECUTE stmt;

    SET @output = CONCAT('CREATE SCHEMA IF NOT EXISTS ', new_db, ';');
    PREPARE stmt FROM @output;
    EXECUTE stmt;

    OPEN old_tables;
    REPEAT
        FETCH old_tables INTO current_table;
        IF NOT done THEN
        SET @output = CONCAT('alter table ', old_db, '.', current_table, ' rename ', new_db, '.', current_table, ';');
        PREPARE stmt FROM @output;
        EXECUTE stmt;

        END IF;
    UNTIL done END REPEAT;

    CLOSE old_tables;

END//
delimiter ;

Die meisten Antworten hier sind aus zwei Gründen falsch:

  1. You cannot just use RENAME TABLE, because there might be views and triggers. If there are triggers, RENAME TABLE fails
  2. You cannot use mysqldump if you want to "quickly" (as requested in the question) rename a big database

Percona has a blog post about how to do this well: https://www.percona.com/blog/2013/12/24/renaming-database-schema-mysql/

and script posted (made?) by Simon R Jones that does what is suggested in that post. I fixed a bug I found in the script. You can see it here:

https://gist.github.com/ryantm/76944318b0473ff25993ef2a7186213d

Here is a copy of it:

#!/bin/bash
# Copyright 2013 Percona LLC and/or its affiliates
# @see https://www.percona.com/blog/2013/12/24/renaming-database-schema-mysql/
set -e
if [ -z "$3" ]; then
    echo "rename_db <server> <database> <new_database>"
    exit 1
fi
db_exists=`mysql -h $1 -e "show databases like '$3'" -sss`
if [ -n "$db_exists" ]; then
    echo "ERROR: New database already exists $3"
    exit 1
fi
TIMESTAMP=`date +%s`
character_set=`mysql -h $1 -e "SELECT default_character_set_name FROM information_schema.SCHEMATA WHERE schema_name = '$2'" -sss`
TABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss`
STATUS=$?
if [ "$STATUS" != 0 ] || [ -z "$TABLES" ]; then
    echo "Error retrieving tables from $2"
    exit 1
fi
echo "create database $3 DEFAULT CHARACTER SET $character_set"
mysql -h $1 -e "create database $3 DEFAULT CHARACTER SET $character_set"
TRIGGERS=`mysql -h $1 $2 -e "show triggers\G" | grep Trigger: | awk '{print $2}'`
VIEWS=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='VIEW'" -sss`
if [ -n "$VIEWS" ]; then
    mysqldump -h $1 $2 $VIEWS > /tmp/${2}_views${TIMESTAMP}.dump
fi
mysqldump -h $1 $2 -d -t -R -E > /tmp/${2}_triggers${TIMESTAMP}.dump
for TRIGGER in $TRIGGERS; do
    echo "drop trigger $TRIGGER"
    mysql -h $1 $2 -e "drop trigger $TRIGGER"
done
for TABLE in $TABLES; do
    echo "rename table $2.$TABLE to $3.$TABLE"
    mysql -h $1 $2 -e "SET FOREIGN_KEY_CHECKS=0; rename table $2.$TABLE to $3.$TABLE"
done
if [ -n "$VIEWS" ]; then
    echo "loading views"
    mysql -h $1 $3 < /tmp/${2}_views${TIMESTAMP}.dump
fi
echo "loading triggers, routines and events"
mysql -h $1 $3 < /tmp/${2}_triggers${TIMESTAMP}.dump
TABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss`
if [ -z "$TABLES" ]; then
    echo "Dropping database $2"
    mysql -h $1 $2 -e "drop database $2"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.columns_priv where db='$2'" -sss` -gt 0 ]; then
    COLUMNS_PRIV="    UPDATE mysql.columns_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.procs_priv where db='$2'" -sss` -gt 0 ]; then
    PROCS_PRIV="    UPDATE mysql.procs_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.tables_priv where db='$2'" -sss` -gt 0 ]; then
    TABLES_PRIV="    UPDATE mysql.tables_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.db where db='$2'" -sss` -gt 0 ]; then
    DB_PRIV="    UPDATE mysql.db set db='$3' WHERE db='$2';"
fi
if [ -n "$COLUMNS_PRIV" ] || [ -n "$PROCS_PRIV" ] || [ -n "$TABLES_PRIV" ] || [ -n "$DB_PRIV" ]; then
    echo "IF YOU WANT TO RENAME the GRANTS YOU NEED TO RUN ALL OUTPUT BELOW:"
    if [ -n "$COLUMNS_PRIV" ]; then echo "$COLUMNS_PRIV"; fi
    if [ -n "$PROCS_PRIV" ]; then echo "$PROCS_PRIV"; fi
    if [ -n "$TABLES_PRIV" ]; then echo "$TABLES_PRIV"; fi
    if [ -n "$DB_PRIV" ]; then echo "$DB_PRIV"; fi
    echo "    flush privileges;"
fi

Save it to a file called rename_db and make the script executable with chmod +x rename_db then use it like ./rename_db localhost old_db new_db


Einfachste Methode, um eine vollständige Umbenennung durchzuführen (einschließlich des Löschens der alten Datenbank am Ende, so dass es sich um eine Umbenennung und nicht um eine Kopie handelt) :

mysqladmin -uroot -pmypassword create newdbname
mysqldump -uroot -pmypassword --routines olddbname | mysql -uroot -pmypassword newdbname
mysqladmin -uroot -pmypassword drop olddbname

Schritte:

  1. Kopieren Sie die Zeilen in den Editor.
  2. Ersetzen Sie alle Verweise auf "olddbname", "newdbname", "mypassword" (+ optional "root") durch Ihre Entsprechungen.
  3. Führen Sie nacheinander in der Befehlszeile aus (geben Sie "y" ein, wenn Sie dazu aufgefordert werden).

Emulation des fehlenden RENAME DATABASE Befehls in MySQL:

  1. Erstellen Sie eine neue Datenbank
  2. Erstellen Sie die Umbenennungsabfragen mit:

    SELECT CONCAT('RENAME TABLE ',table_schema,'.',table_name,
        ' TO ','new_schema.',table_name,';')
    FROM information_schema.TABLES
    WHERE table_schema LIKE 'old_schema';
    
  3. Führen Sie diese Ausgabe aus

  4. Lösche alte Datenbank

Es wurde von Emulation des fehlenden RENAME DATABASE-Befehls in MySQL übernommen .


Für InnoDB scheint das Folgende zu funktionieren: Erstellen Sie die neue leere Datenbank und benennen Sie anschließend jede Tabelle der Reihe nach in die neue Datenbank um:

RENAME TABLE old_db.table TO new_db.table;

Sie müssen die Berechtigungen danach anpassen.

Für das Skripting in einer Shell können Sie Folgendes verwenden:

mysql -u username -ppassword old_db -sNe 'show tables' | while read table; \ 
    do mysql -u username -ppassword -sNe "rename table old_db.$table to new_db.$table"; done

Oder

for table in `mysql -u root -ppassword -s -N -e "use old_db;show tables from old_db;"`; do mysql -u root -ppassword -s -N -e "use old_db;rename table old_db.$table to new_db.$table;"; done;

Hinweise: Zwischen der Option -p und dem Passwort ist kein Leerzeichen. Wenn Ihre Datenbank kein Kennwort enthält, entfernen Sie den -u username -ppassword Teil.

Wenn Sie Prozeduren gespeichert haben, können Sie sie auch später kopieren:

mysqldump -R old_db | mysql new_db

Für diejenigen, die Mac-Benutzer sind, verfügt Sequel Pro über die Option Datenbank umbenennen im Menü Datenbank. http://www.sequelpro.com/


Ich bin erst kürzlich auf eine sehr nette Art und Weise dazu gekommen, arbeite mit MyISAM und InnoDB und bin sehr schnell:

RENAME TABLE old_db.table TO new_db.table;

Ich kann mich nicht erinnern, wo ich es gelesen habe, aber Kredit geht an jemand anderen, nicht an mich.


Ich denke, die Lösung ist einfacher und wurde von einigen Entwicklern vorgeschlagen. phpMyAdmin hat dafür eine Operation.

Wählen Sie in phpMyAdmin die Datenbank aus, die Sie auswählen möchten. In den Registerkarten gibt es einen namens Operationen, gehen Sie zum Umbenennen. Das ist alles.

Es wird, wie viele vorgeschlagen haben, eine neue Datenbank mit dem neuen Namen erstellt, alle Tabellen der alten Datenbank in der neuen Datenbank abgelegt und die alte Datenbank gelöscht.


Im Folgenden finden Sie ein kleines Shellskript, das mit zwei Parametern ausgeführt werden muss: db-name und new db-name.

Möglicherweise müssen Sie den mysql-Zeilen Anmeldeparameter hinzufügen, wenn Sie die .my.cnf-Datei nicht in Ihrem Home-Verzeichnis verwenden. Bitte machen Sie eine Sicherungskopie, bevor Sie dieses Skript ausführen.

#!/usr/bin/env bash

mysql -e "CREATE DATABASE $2 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;"
for i in $(mysql -Ns $1 -e "show tables");do
    echo "$1.$i -> $2.$i"
    mysql -e "rename TABLE $1.$i to $2.$i"
done
mysql -e "DROP DATABASE $1"

MySQL unterstützt derzeit nicht das Umbenennen einer Datenbank über seine Befehlsschnittstelle, aber Sie können die Datenbank umbenennen, wenn Sie Zugriff auf das Verzeichnis haben, in dem MySQL seine Datenbanken speichert. Bei Standard-MySQL-Installationen befindet sich dies normalerweise im Verzeichnis Data unter dem Verzeichnis, in dem MySQL installiert wurde. Suchen Sie den Namen der Datenbank, die Sie umbenennen möchten, im Verzeichnis Data und benennen Sie sie um. Das Umbenennen des Verzeichnisses könnte jedoch zu einigen Berechtigungsproblemen führen. Sei vorsichtig.

Hinweis: Sie müssen MySQL stoppen, bevor Sie die Datenbank umbenennen können

Ich würde empfehlen, eine neue Datenbank (mit dem gewünschten Namen) zu erstellen und die Daten, die Sie benötigen, vom alten zum neuen zu exportieren / importieren. Ziemlich einfach.


Sie können dieses Shell-Skript verwenden:

Referenz: Wie kann ich eine MySQL-Datenbank umbenennen?

#!/bin/bash
set -e # terminate execution on command failure

mysqlconn="mysql -u root -proot"
olddb=$1
newdb=$2
$mysqlconn -e "CREATE DATABASE $newdb"
params=$($mysqlconn -N -e "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES \
                           WHERE table_schema='$olddb'")
for name in $params; do
      $mysqlconn -e "RENAME TABLE $olddb.$name to $newdb.$name";
done;
$mysqlconn -e "DROP DATABASE $olddb"

Es funktioniert:

$ sh rename_database.sh oldname newname

Sie können mit SQL ein SQL-Skript generieren, um jede Tabelle in Ihrer Quelldatenbank an die Zieldatenbank zu übertragen.

Sie müssen die Zieldatenbank erstellen, bevor Sie das über den Befehl generierte Skript ausführen können.

Sie können eines dieser beiden Skripte verwenden (ich habe ursprünglich das GROUP_CONCAT vorgeschlagen und jemand hat meine Antwort "verbessert", um GROUP_CONCAT zu verwenden. GROUP_CONCAT Sie, aber ich bevorzuge das Original):

SELECT CONCAT('RENAME TABLE $1.', table_name, ' TO $2.', table_name, '; ')
FROM information_schema.TABLES 
WHERE table_schema='$1';

oder

SELECT GROUP_CONCAT('RENAME TABLE $1.', table_name, ' TO $2.', table_name SEPARATOR '; ')
FROM information_schema.TABLES 
WHERE table_schema='$1';

($ 1 und $ 2 sind Quelle bzw. Ziel)

Dies erzeugt einen SQL-Befehl, den Sie dann ausführen müssen.

Beachten Sie, dass GROUP_CONCAT eine Standardlänge hat, die für Datenbanken mit einer großen Anzahl von Tabellen überschritten werden kann. Sie können dieses Limit ändern, indem Sie SET SESSION group_concat_max_len = 100000000; (oder eine andere große Zahl).


Wenn Sie eine Datenbank in PHPMyAdmin umbenennen, erstellt sie einen Speicherabzug und löscht die Datenbank mit dem neuen Namen.


For mac users, you can use Sequel Pro (free), which just provide the option to rename Databases. Though it doesn't delete the old DB.

once open the relevant DB just click: Database --> Rename database...


I did it this way: Take backup of your existing database. It will give you a db.zip.tmp and then in command prompt write following

"C:\Program Files (x86)\MySQL\MySQL Server 5.6\bin\mysql.exe" -h localhost -u root -p[password] [new db name] < "C:\Backups\db.zip.tmp"


If you are using phpMyAdmin you can go to the "operations" tab once you have selected the database you want to rename. Then go to the last section "copy database to" (or something like that), give a name, and select the options below. In this case, I guess you must select "structure and data" and "create database before copying" checkboxes and, finally, press the "go" button in that section.

By the way, I'm using phpMyAdmin in Spanish so I'm not sure what the names of the sections are in English.


Seems noone mentioned this but here is another way:

create database NewDatabaseName like OldDatabaseName;

then for each table do:

create NewDatabaseName.tablename like OldDatabaseName.tablename;
insert into NewDataBaseName.tablename select * from OldDatabaseName.tablename;

then, if you want to,

drop database OldDatabaseName;

This approach would have the advantage of doing the entire transfer on server with near zero network traffic, so it will go a lot faster than a dump/restore.

If you do have stored procedures/views/etc you might want to transfer them as well.


This works for all databases and works by renaming each table with maatkit mysql toolkit

Use mk-find to print and rename each table. The man page has many more options and examples

mk-find --dblike OLD_DATABASE --print --exec "RENAME TABLE %D.%N TO NEW_DATABASE.%N"

If you have maatkit installed ( which is very easy ), then this is the simplest way to do it.







rename