كيف يمكنني بسرعة إعادة تسمية قاعدة بيانات MySQL(تغيير اسم المخطط)؟




database innodb (20)

يغطي دليل MySQL على MySQL هذا.

عادة ما أقوم فقط بتفريغ قاعدة البيانات وإعادة استيرادها باسم جديد. هذا ليس خيارًا لقواعد البيانات الكبيرة جدًا. على ما يبدو إعادة RENAME {DATABASE | SCHEMA} db_name TO new_db_name; RENAME {DATABASE | SCHEMA} db_name TO new_db_name; MySQL .

هذا يحتاج إلى العمل مع InnoDB ، الذي يخزن الأشياء بشكل مختلف تمامًا عن MyISAM .


الطريقة البسيطة

التغيير إلى دليل قاعدة البيانات:

cd /var/lib/mysql/

اغلاق الخلية ... وهذا أمر مهم!

/etc/init.d/mysql stop

حسنًا ، لا تعمل هذه الطريقة مع InnoDB أو قواعد بيانات BDB.

إعادة تسمية قاعدة البيانات:

mv old-name new-name

... أو الطاولة ...

cd database/

mv old-name.frm new-name.frm

mv old-name.MYD new-name.MYD

mv old-name.MYI new-name.MYI

إعادة تشغيل MySQL

/etc/init.d/mysql start

فعله...

حسنًا ، لا تعمل هذه الطريقة مع قواعد بيانات InnoDB أو BDB. في هذه الحالة عليك تفريغ قاعدة البيانات وإعادة استيرادها.


أبسط طريقة للتخلص من الطلقات النارية والقيام بعملية إعادة تسمية كاملة (بما في ذلك إسقاط قاعدة البيانات القديمة في النهاية بحيث يكون إعادة تسميتها بدلاً من نسخة) :

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

خطوات:

  1. نسخ الخطوط في المفكرة.
  2. استبدال كافة المراجع إلى "olddbname" أو "newdbname" أو "mypassword" (+ اختيارياً "الجذر") مع مكافئات الخاص بك.
  3. تنفيذ واحد تلو الآخر على سطر الأوامر (إدخال "y" عند المطالبة).

أعتقد أن الحل أبسط واقترحه بعض المطورين. phpMyAdmin لديه عملية لهذا.

من phpMyAdmin ، حدد قاعدة البيانات التي تريد تحديدها. في علامات التبويب هناك واحد يسمى العمليات ، انتقل إلى قسم إعادة التسمية. هذا كل شئ.

وهو يفعل ، كما اقترح الكثيرون ، إنشاء قاعدة بيانات جديدة بالاسم الجديد ، وتفريغ جميع جداول قاعدة البيانات القديمة في قاعدة البيانات الجديدة وإفلات قاعدة البيانات القديمة.


استخدم هذه الأوامر البسيطة القليلة:

mysqldump -u username -p -v olddatabase > olddbdump.sql
mysqladmin -u username -p create newdatabase
mysql -u username -p newdatabase < olddbdump.sql

أو لتقليل استخدام الإدخال / الإخراج ، استخدم ما يلي كما هو مقترح بواسطةPablo Marin-Garcia:

mysqladmin -u username -p create newdatabase
mysqldump -u username -v olddatabase -p | mysql -u username -p -D newdatabase

بالنسبة لـ InnoDB ، يبدو أن العمل التالي: إنشاء قاعدة بيانات فارغة جديدة ، ثم إعادة تسمية كل جدول بدوره إلى قاعدة البيانات الجديدة:

RENAME TABLE old_db.table TO new_db.table;

ستحتاج إلى ضبط الأذونات بعد ذلك.

للبرمجة النصية في shell ، يمكنك استخدام أي مما يلي:

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

أو

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;

ملاحظات: لا توجد مسافة بين الخيار -p وكلمة المرور. إذا كانت قاعدة البيانات لا تحتوي على كلمة مرور ، فأزل جزء -u username -ppassword .

أيضًا ، إذا كان لديك إجراءات مخزنة ، فيمكنك نسخها بعد ذلك:

mysqldump -R old_db | mysql new_db

ثلاثة خيارات:

  1. إنشاء قاعدة بيانات جديدة ، اسقاط الخادم ، ونقل الملفات من مجلد قاعدة بيانات واحدة إلى أخرى ، وإعادة تشغيل الخادم. لاحظ أن هذا سيعمل فقط إذا كانت جميع جداولك هي MyISAM.

  2. إنشاء قاعدة بيانات جديدة استخدم عبارات CREATE TABLE ... LIKE ثم استخدم عبارات INSERT ... SELECT * FROM.

  3. استخدم mysqldump وأعد تحميل ذلك الملف.


عند إعادة تسمية قاعدة بيانات في PHPMyAdmin يقوم بإنشاء ملف تفريغ ، ثم يسقط ويعيد إنشاء قاعدة البيانات بالاسم الجديد.


لا يدعم MySQL إعادة تسمية قاعدة البيانات من خلال واجهة الأوامر الخاصة بها في الوقت الحالي ، ولكن يمكنك إعادة تسمية قاعدة البيانات إذا كان لديك حق الوصول إلى الدليل الذي تقوم MySQL بتخزين قواعد البيانات الخاصة به. بالنسبة إلى عمليات تثبيت MySQL الافتراضية ، عادة ما يكون ذلك في دليل البيانات ضمن الدليل الذي تم تثبيت MySQL عليه. حدد اسم قاعدة البيانات التي تريد إعادة تسميتها أسفل دليل البيانات وأعد تسميتها. إعادة تسمية الدليل قد يسبب بعض مشكلات الأذونات بالرغم من ذلك. كن حذرا.

ملاحظة: يجب إيقاف MySQL قبل أن تتمكن من إعادة تسمية قاعدة البيانات

أوصي بإنشاء قاعدة بيانات جديدة (باستخدام الاسم الذي تريده) وتصدير / استيراد البيانات التي تحتاجها من القديم إلى الجديد. بسيط جدا.


لقد تعرفت مؤخراً فقط على طريقة لطيفة للغاية للقيام بذلك ، وتعمل مع MyISAM و InnoDB وهي سريعة جدًا:

RENAME TABLE old_db.table TO new_db.table;

لا أتذكر أين أقرأها ولكن الفضل يعود لشخص آخر ليس أنا.


لم يعمل الإجراء TodoInTX المخزنة بالنسبة لي. وهنا طعنات في ذلك:

-- 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 ;

معظم الإجابات هنا خاطئة لسببين:

  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


من الممكن إعادة تسمية كافة الجداول داخل قاعدة بيانات لتكون تحت قاعدة بيانات أخرى دون الحاجة إلى إجراء تفريغ كاملة واستعادة.

DROP PROCEDURE IF EXISTS mysql.rename_db;
DELIMITER ||
CREATE PROCEDURE mysql.rename_db(IN old_db VARCHAR(100), IN new_db VARCHAR(100))
BEGIN
SELECT CONCAT('CREATE DATABASE ', new_db, ';') `# create new database`;
SELECT CONCAT('RENAME TABLE `', old_db, '`.`', table_name, '` TO `', new_db, '`.`', table_name, '`;') `# alter table` FROM information_schema.tables WHERE table_schema = old_db;
SELECT CONCAT('DROP DATABASE `', old_db, '`;') `# drop old database`;
END||
DELIMITER ;

$ time mysql -uroot -e "call mysql.rename_db('db1', 'db2');" | mysql -uroot

ومع ذلك فإن أي محفزات في الهدف ديسيبل لن يكون سعيدا. ستحتاج إلى إسقاطها أولاً ثم إعادة إنشائها بعد إعادة التسمية.

mysql -uroot -e "call mysql.rename_db('test', 'blah2');" | mysql -uroot
ERROR 1435 (HY000) at line 4: Trigger in wrong schema

هنا هو ملف دفعي كتبت لأتمتة من سطر الأوامر ، ولكن لنظام التشغيل Windows / MS-DOS.

بناء الجملة هو قاعدة البيانات rename_mysqldb newdatabase -u [مستخدم] -p [كلمة المرور]

:: ***************************************************************************
:: FILE: RENAME_MYSQLDB.BAT
:: ***************************************************************************
:: DESCRIPTION
:: This is a Windows /MS-DOS batch file that automates renaming a MySQL database 
:: by using MySQLDump, MySQLAdmin, and MySQL to perform the required tasks.
:: The MySQL\bin folder needs to be in your environment path or the working directory.
::
:: WARNING: The script will delete the original database, but only if it successfully
:: created the new copy. However, read the disclaimer below before using.
::
:: DISCLAIMER
:: This script is provided without any express or implied warranties whatsoever.
:: The user must assume the risk of using the script.
::
:: You are free to use, modify, and distribute this script without exception.
:: ***************************************************************************

:INITIALIZE
@ECHO OFF
IF [%2]==[] GOTO HELP
IF [%3]==[] (SET RDB_ARGS=--user=root) ELSE (SET RDB_ARGS=%3 %4 %5 %6 %7 %8 %9)
SET RDB_OLDDB=%1
SET RDB_NEWDB=%2
SET RDB_DUMPFILE=%RDB_OLDDB%_dump.sql
GOTO START

:START
SET RDB_STEP=1
ECHO Dumping "%RDB_OLDDB%"...
mysqldump %RDB_ARGS% %RDB_OLDDB% > %RDB_DUMPFILE%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=2
ECHO Creating database "%RDB_NEWDB%"...
mysqladmin %RDB_ARGS% create %RDB_NEWDB%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=3
ECHO Loading dump into "%RDB_NEWDB%"...
mysql %RDB_ARGS% %RDB_NEWDB% < %RDB_DUMPFILE%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=4
ECHO Dropping database "%RDB_OLDDB%"...
mysqladmin %RDB_ARGS% drop %RDB_OLDDB% --force
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=5
ECHO Deleting dump...
DEL %RDB_DUMPFILE%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
ECHO Renamed database "%RDB_OLDDB%" to "%RDB_NEWDB%".
GOTO END

:ERROR_ABORT
IF %RDB_STEP% GEQ 3 mysqladmin %RDB_ARGS% drop %NEWDB% --force
IF %RDB_STEP% GEQ 1 IF EXIST %RDB_DUMPFILE% DEL %RDB_DUMPFILE%
ECHO Unable to rename database "%RDB_OLDDB%" to "%RDB_NEWDB%".
GOTO END

:HELP
ECHO Renames a MySQL database.
ECHO Usage: %0 database new_database [OPTIONS]
ECHO Options: Any valid options shared by MySQL, MySQLAdmin and MySQLDump.
ECHO          --user=root is used if no options are specified.
GOTO END    

:END
SET RDB_OLDDB=
SET RDB_NEWDB=
SET RDB_ARGS=
SET RDB_DUMP=
SET RDB_STEP=

يمكنك استخدام SQL لإنشاء برنامج نصي SQL لنقل كل جدول في قاعدة البيانات المصدر إلى قاعدة البيانات الوجهة.

يجب عليك إنشاء قاعدة البيانات الوجهة قبل تشغيل البرنامج النصي الذي تم إنشاؤه من الأمر.

يمكنك استخدام أي من هذين النصين (أقترح في الأصل أن يكون الشخص السابق قد قام بتحسين جوابي لاستخدام GROUP_CONCAT . تفضل GROUP_CONCAT ، لكنني أفضل النص الأصلي):

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

أو

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

($ 1 و $ 2 هما المصدر والهدف على التوالي)

سيؤدي ذلك إلى إنشاء أمر SQL سيتعين عليك تشغيله بعد ذلك.

لاحظ أن GROUP_CONCAT لها حد طول افتراضي قد يتم تجاوزه لقواعد البيانات التي تحتوي على عدد كبير من الجداول. يمكنك تغيير هذا الحد عن طريق تشغيل SET SESSION group_concat_max_len = 100000000; (أو بعض الأرقام الكبيرة الأخرى).


طرحت سؤالاً على "خطأ الخادم" الذي يحاول الالتفاف حول وقت التوقف عند استعادة قواعد البيانات الكبيرة باستخدام MySQL Proxy. لم أحقق أي نجاح ، لكنني أدركت في النهاية أن ما أريده هو وظيفة RENAME DATABASE لأن التفريغ / الاستيراد لم يكن خيارًا بسبب حجم قاعدة البيانات الخاصة بنا.

توجد وظيفة RENAME TABLE مضمنة في MySQL لذا انتهى بي الأمر كتابة سيناريو بايثون بسيط للقيام بهذه المهمة بالنسبة لي. لقد قمت بنشره على GitHub في حالة ما قد يكون مفيدًا للآخرين.


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