Tezliklə MySQL verilənlər bazasını dəyişmək (dəyişdirmək şeması adı)?

MySQL-də MySQL kitabçası bunu təsvir edir.

Mən adətən verilənlər bazasını və yeni bir adla reimportu buraxıram. Bu, çox böyük məlumat bazaları üçün bir seçim deyil. Göründüyü kimi, RENAME {DATABASE | SCHEMA} db_name TO new_db_name; RENAME {DATABASE | SCHEMA} db_name TO new_db_name; pis şeylər edir, yalnız bir neçə versiyası var və bu ümumiyyətlə pis bir fikirdir .

Bu, MyISAM- dən fərqli olan şeyləri saxlayan InnoDB ilə işləməlidir.

802
16 сент. ölü proqramlaşdırma proqramı 16 sept. 2008-09-16 00:22 '08 'də 0:22' da 2008-09-16 00:22 'də
@ 47 cavab
  • 1
  • 2

InnoDB üçün aşağıdakılar işləyirdi: yeni bir boş verilənlər bazası yaradın və hər bir masanın növbəsində yeni bir verilənlər bazasına yenidən adını verin:

 RENAME TABLE old_db.table TO new_db.table; 

Bundan sonra icazələri tənzimləmək lazımdır.

Kabuktaki skriptlər üçün aşağıdakılardan birini istifadə edə bilərsiniz:

 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 

və ya

 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; 

Qeydlər: -p variant və parol arasında bir boşluq yoxdur. Verilənlər bazasında şifrəniz -u username -ppassword , -u username -ppassword çıxarın.

Bundan əlavə, prosedurları saxladığınız təqdirdə, daha sonra kopyalayabilirsiniz:

 mysqldump -R old_db | mysql new_db 
690
19 февр. Cavab verildi Thorsten Feb 19 2010-02-19 21:17 '10 at 21:17 2010-02-19 21:17

Bir neçə sadə əmrdən istifadə edin:

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

Və ya I / O'yı azaltmaq üçün @Pablo Marin-Garcia tərəfindən təklif olunanları istifadə edin:

 mysqladmin -u username -p create newdatabase mysqldump -u username -v olddatabase -p | mysql -u username -p -D newdatabase 
395
02 июля '09 в 10:34 2009-07-02 10:34 cavab 02 iyul 2009 - cu il tarixində saat 10: 34 -da veriləcək

Hesab edirəm ki, həll sadədir və bəzi inkişafçılar tərəfindən təklif olundu. Bunun üçün, phpMyAdmin əməliyyat var.

PhpMyAdmin-dən, seçmək istədiyiniz verilənlər bazasını seçin. Orada "Əməliyyatlar" adlı nişanlar, adını dəyişmək bölməsinə keçin. Bütün bunlar.

O, bir çoxları kimi yeni bir verilənlər bazası ilə yeni bir verilənlər bazası yaradır, köhnə məlumat bazasının bütün masalarını yeni verilənlər bazasına salır və köhnə verilənlər bazasını silməkdədir.

2019

189
15 янв. Cavab yanvarın 15-də verilir 2012-01-15 22:46 '12 saat 10:46 'da 2012-01-15 22:46

SQL verilənlər bazasında hər bir masanın hədəf verilənlər bazasına köçürülməsi üçün bir SQL skript yaratmaq üçün SQL istifadə edə bilərsiniz.

Komanda yaradılmış skript çalıştırmadan əvvəl, bir hedef verilənlər bazası yaratmalısınız.

Bu iki ssenaridən birini istifadə edə bilərsiniz (mən ilk olaraq GROUP_CONCAT istifadə etmək üçün cavabı "təkmilləşdirmək" təklifini verdim.

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

və ya

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

($ 1 və $ 2 - mənbə və hədəf)

Bu, çalıştırmanız gereken bir SQL əmri yaradacaq.

GROUP_CONCAT in çox sayda verilənlər bazası üçün aşılması mümkün olan bir u mənim limit var. SET SESSION group_concat_max_len = 100000000; çalıştırarak bu SET SESSION group_concat_max_len = 100000000; (və ya digər bir çox sayda).

93
26 нояб. cavab Nov. 26, ErichBSchulz tərəfindən verilir 2011-11-26 06:35 '11 saat 06:35 'da 2011-11-26 06:35

Üç variant:

  • Yeni bir verilənlər bazası yaradın, server aşağı salın, faylları bir verilənlər bazası qovluğundan digərinə köçürün və serverı yenidən başladın. Xahiş edirik unutmayın ki, bu yalnız bütün masalar MyISAM olduğunda işləyəcəkdir.

  • Yeni bir verilənlər bazası yaradın, CREATE TABLE ... LIKE deyimini istifadə edin və sonra INSERT ... SEÇİN * FROM ifadəsini istifadə edin.

  • Mysqldump istifadə edin və bu fayl ilə yenidən başladın.

24
16 сент. cavabı 16 dırnaqda verilir . 2008-09-16 00:28 '08 at 0:28 2008-09-16 00:28

Asan yol

Baza qovluğuna keçin:

 cd /var/lib/mysql/ 

MySQL-ni bağla ... Bu vacibdir!

 /etc/init.d/mysql stop 

Yaxşı, bu üsul InnoDB və ya BDB məlumat bazaları üçün işləmir.

Verilənlərin bazasını dəyişin:

 mv old-name new-name 

... və ya masa ...

 cd database/ mv old-name.frm new-name.frm mv old-name.MYD new-name.MYD mv old-name.MYI new-name.MYI 

Mysql-ni yenidən başladın

 /etc/init.d/mysql start 

Tamamlandı ...

Tamam, bu üsul InnoDB və ya BDB verilənlər bazaları ilə işləmir. Bu halda, verilənlər bazasını yenidən qurmaq və yenidən idxal etmək lazımdır.

23
16 сент. Cavab DeeCee tərəfindən verildi. 2008-09-16 00:30 '08 saat 00:30 'da 2008-09-16 00:30' da

Bu yaxınlarda mən çox yaxşı bir yola qaçdım, bu MyISAM və InnoDB ilə işləyir və çox tez:

 RENAME TABLE old_db.table TO new_db.table; 

Mən onu oxuduğumu xatırlamıram, amma kredit mənə deyil, digərinə aiddir.

20
07 мая '10 в 16:15 2010-05-07 16:15 Cavab 07 may 2010-cu il saat 16: 00-da Amr Mostafa tərəfindən verilmişdir. 2010-05-07 16:15

Eksik RENAME RENAME DATABASE MySQL-də təkrarlamaq:

  • Yeni bir məlumat bazası yaradın
  • Yenidən adları istəkləri ilə yaradın:

     SELECT CONCAT('RENAME TABLE ',table_schema,'.',table_name, ' TO ','new_schema.',table_name,';') FROM information_schema.TABLES WHERE table_schema LIKE 'old_schema'; 
  • Bu çıxışı çalıştırın

  • Köhnə məlumat bazasını silin

Bu, MySQL-də itkin RENAME DATABASE əmrini işarələyin .

18
10 авг. Cavab Marciano tərəfindən 10 avqu. 2012-08-10 23:43 '12 at 23:43 2012-08-10 23:43

Mən bu istifadə edirəm:

 $ 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; 
16
28 окт. Cavab 28 oct . 2010-10-28 18:01 '10 at 18:01 2010-10-28 18:01

MySQL verilənlər bazasını hazırda əmr interfeysi ilə adlandırmayı bilmir, lakin MySQL-in veritabanlarını saxladığı qovluğa çıxarsanız verilənlər bazasını dəyişə bilərsiniz. Standart olaraq MySQL qurulmaları üçün, bu, ümumiyyətlə, MySQL-in quraşdırıldığı kataloqdakı məlumatlar kataloqunda yerləşdirilir. Verilən kataloqda adını dəyişmək və onu yenidən adlandırmaq istədiyiniz verilənlər bazasının adını tapın. Lakin, bir qovluğu adlandırma bəzi icazələrin problemlərinə səbəb ola bilər. Unutmayın.

Qeyd Verilənlər bazasını dəyişmək üçün MySQL-i dayandırmalısınız.

Yeni bir verilənlər bazasını (istənilən adı istifadə edərək) yaratmaq və köhnədən yeni məlumatları ixrac etmək / idxal etmək məsləhətdir. Pretty sadə.

14
16 сент. bryanpearson tərəfindən verilmiş cavab 16 sentyabr . 2008-09-16 00:26 '08 saat 12:26 'da 2008-09-16 00:26

Tam adını dəyişmək üçün ən sadə qurğuşunsuz yolu (adını dəyişdirmək üçün köhnə məlumat bazasını silin, bir surəti deyil):

13
14 янв. 14 yanvarda Steve Chambers tərəfindən verilmiş cavab 2016-01-14 19:42 '16 saat 07:42 'də 2016-01-14 19:42

Bir verilənlər bazasını PHPMyAdmin olaraq adlandırdığınızda, bir dökümü yaradır, sonra sıfırlar və yeni bir adla verilənlər bazasını yenidən yaradır.

13
16 сент. Cavab UnkwnTech tərəfindən verilib 16 sentyabr. 2008-09-16 00:24 '08 saat 00:24 'da 2008-09-16 00:24

Mac istifadəçiləri üçün, Sequel Pro "Veritabanı" menyusundakı "Veriyi Yenidən Başla" seçimi var. http://www.sequelpro.com/

12
30 нояб. Cavab Duke 30 noyabrda verilir. 2012-11-30 04:06 '12 'də saat 04:06' da

Bu kabuk skriptini istifadə edə bilərsiniz:

Yardım: MySQL verilənlər bazasını necə adlandırmaq olar?

 #!/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" 

İşləyir:

 $ sh rename_database.sh oldname newname 
11
07 февр. Grijesh Chauhan tərəfindən verilmiş cavab 07 fevral. 2013-02-07 09:54 '13 'da 9:54' da 2013-02-07 09:54

Bəli, 2 üsul var:

Metod 1: Bir verilənlər bazası sxeminin adını dəyişdirmək üçün tanınmış metod, Mysqldump ilə sxemləri yenidən qurmaq və başqa bir sxemə bərpa etmək və daha sonra köhnə sxemləri (zəruri olduqda) silməkdir.

Kabukdan çıxmaq

  mysqldump emp > emp.out mysql -e "CREATE DATABASE employees;" mysql employees < emp.out mysql -e "DROP DATABASE emp;" 

Yuxarıda göstərilən üsul sadə olsa da, vaxt və yerdir. Sxem 100 GB- dən çox olarsa ? . Yuxarıda göstərilən əmrləri məkanda saxlamaq üçün birləşdirə bilən üsullar var, lakin bu vaxtdan xilas ola bilməz.

Belə halları düzəltmək üçün sxemləri yenidən adlandırmaq üçün daha sürətli bir yol var, ancaq qayğı göstərilməlidir.

Metod 2: MySQL müxtəlif şemalarda işləyən cədvəllərin dəyişdirilməsi üçün çox yaxşı bir funksiyaya malikdir. Bu adının dəyişdirilməsi atomdur və adını dəyişdikdə heç kim masaya daxil ola bilməz. Cədvəlin adını və ya sxemini dəyişdirmək metadata yalnız bir dəyişiklik olduğundan bu, qısa müddətə aparılacaq. Yenidən adlandırmaq olarsa, prosessual yanaşma var:

İstədiyiniz adla yeni verilənlər bazası şemasını yaradın. MySQL RENAME TABLE komutunu istifadə edərək köhnə sxemdən yeni sxemə masaları dəyişin. Köhnə verilənlər bazası sxemini buraxın. If there are views, triggers, functions, stored procedures in the schema, those will need to be recreated too Masalardakı tetikleyiciler varsa MySQL "RENAME TABLE" uğursuz olur. Bunu düzəltmək üçün aşağıdakıları edə bilərik:

1) Dump the triggers, events and stored routines in a separate file. Bu, mysqldump əmrinə -E, -R bayraqları (t-t-t-t-t tirmələri əlavə) istifadə edilir. Tetikleyiciler sıfırlanıldıktan sonra, RENAME TABLE komutunun çalışması üçün onları devreden çıxartmaq lazımdır.

  $ mysqldump <old_schema_name> -d -t -R -E > stored_routines_triggers_events.out 

2) Yalnız "BASE" cədvəlləri yaradın. Onlar data_schema.TABLES tablosunda sorğu istifadə edərək tapıla bilər.

  mysql> select TABLE_NAME from information_schema.tables where table_schema='<old_schema_name>' and TABLE_TYPE='BASE TABLE'; 

3) Çıxış faylında görünüşləri atın. Baxışlar, eyni information_schema.TABLES cədvəlində bir sorgu istifadə edərək tapıla bilər.

 mysql> select TABLE_NAME from information_schema.tables where table_schema='<old_schema_name>' and TABLE_TYPE='VIEW'; $ mysqldump <database> <view1> <view2> … > views.out 

4) old_schema cari masalardakı tetikleyicileri buraxın.

 mysql> DROP TRIGGER <trigger_name>; ... 

5) 2. addımda tapılan bütün əsas masaların adları dəyişdirildikdən sonra yuxarıdakı dump fayllarını bərpa edin.

 mysql> RENAME TABLE <old_schema>.table_name TO <new_schema>.table_name; ... $ mysql <new_schema> < views.out $ mysql <new_schema> < stored_routines_triggers_events.out 

Yuxarıda göstərilən üsullarla çətinliklər. Düzgün şemanın adını uyğunlaşdırmaq üçün istifadəçilər üçün GRANT'ları yeniləməliyik. Onlar mysql.columns_priv, mysql.procs_priv, mysql.tables_priv, mysql.db, old_schema yeni_schema və "Flush imtiyazlar" səbəb updating sadə UPDATE masalar istifadə edilə bilər. "2-metod" "metod 1" -dən bir qədər daha mürəkkəb olsa da, skriptlər üçün olduqca mümkündür. Yuxarıdakı addımları düzgün ardıcıllıqla yerinə yetirmək üçün sadə bas komanda verilənlər bazası sxemlərini növbəti dəfə adlandırdığınızda zaman və məkanı xilas etməyə kömək edə bilər.

Percona Remote DBA komandası belə bir şəkildə işləyən "rename_db" adlı bir yazı yazıb:

 [root@dba~]# /tmp/rename_db rename_db <server> <database> <new_database> 

Bu skriptin istifadəsini nümayiş etdirmək üçün təxminən "emp" sxemini istifadə etdik, test tetikleyicilerini yaratdıq, bu sxemdə saxlanan proqramları istifadə etdik. Verilənlər bazası sxemini, dump / bərpa metodunu istifadə edərək, bir neçə saniyə başa çatdırmaq üçün lazım olan scriptin adını dəyişməyə çalışacağıq.

 mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | emp | | mysql | | performance_schema | | test | +--------------------+ [root@dba ~]# time /tmp/rename_db localhost emp emp_test create database emp_test DEFAULT CHARACTER SET latin1 drop trigger salary_trigger rename table emp.__emp_new to emp_test.__emp_new rename table emp._emp_new to emp_test._emp_new rename table emp.departments to emp_test.departments rename table emp.dept to emp_test.dept rename table emp.dept_emp to emp_test.dept_emp rename table emp.dept_manager to emp_test.dept_manager rename table emp.emp to emp_test.emp rename table emp.employees to emp_test.employees rename table emp.salaries_temp to emp_test.salaries_temp rename table emp.titles to emp_test.titles loading views loading triggers, routines and events Dropping database emp real 0m0.643s user 0m0.053s sys 0m0.131s mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | emp_test | | mysql | | performance_schema | | test | +--------------------+ 

Yuxarıdakılardan görə bilərsiniz ki, "emp" verilənlər bazası şeması "emp_test" adını bir saniyədən az olaraq dəyişdi. Nəhayət, bu, "metod 2" üçün yuxarıda istifadə olunan Percona scriptidir.

 #!/bin/bash # Copyright 2013 Percona LLC and/or its affiliates 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 "show create database $2\G" -sss | grep ^Create | awk -F'CHARACTER SET ' '{print $2}' | awk '{print $1}'` 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 
11
29 янв. Cavab Sathish D tərəfindən 29 Yanvar verilir 2014-01-29 14:14 '14 'da 14:14' də 2014-01-29 14:14

Bir verilənlər bazasında bütün masaları, tam sıfırlama və bərpa etməməyə ehtiyac olmadan başqa bir verilənlər bazasına dəyişə bilərsiniz.

 DİĞER PROQRAMI MƏSƏLƏ OLMALIDIR əgər mysql.rename_db; DELIMITER || PROSEDUR YARATDIR mysql.rename_db (old_db VARCHAR (100), new_db VARCHAR (100)) BEGIN CONCAT SELECT ('CREATE DATABASE', new_db, ';') `` yeni verilənlər bazası yaratmaq '; CONCAT SEÇİN ('RENAME TABLE`,' old_db, '`.`,' table_name ','` `` ``, ', new_db,' `.` ', table_name,'`; ') `# alter table' FROM information_schema.tables WHERE table_schema = old_db; CONCAT SEÇİN ('DROP DATABASE', 'old_db,' `; ')` # köhnə verilənlər bazası'; END || DELIMITER; $ vaxt mysql -uroot -e "mysql.rename_db ('db1', 'db2');"  |  mysql -uroot

Lakin hədəf db-də hər hansı bir tetikleyici xoşbəxt olmayacaqdır. Əvvəlcə onları buraxma və sonra adları dəyişdirdikdən sonra yenidən yaratmaq lazımdır.

 mysql -uroot -e "mysql.rename_db ('test', 'blah2');"  |  mysql -uroot Xətt 4-də səhv 1435 (HY000): Yanlış şemada tetikleyin
9
19 мая '10 в 20:16 2010-05-19 20:16 cədvəl TodoInTX -ə 19 May '10 'da 20:16' də verildi 2010-05-19 20:16

Komut satırından avtomatlaşdırmaq üçün yazdığım bir yığım faylıdır, lakin Windows / MS-DOS üçün.

Sözdizimi rename_mysqldb veritabanı newdatabase -u [istifadəçi] -p [parol]

 :: *************************************************************************** :: 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= 
7
12 дек. Johnny tərəfindən verilmiş cavab 12 Dek 2008-12-12 13:27 '08 at 13:27 2008-12-12 13:27

Cavabların əksəriyyəti iki səbəbdən biri üçün yanlışdır:

  1. RENAME TABLE istifadə edə bilməzsiniz, çünki görünüş və tetikleyiciler ola bilər. Tetikleyiciler varsa RENAME TABLE işləmir
  2. Siz "tez" (sual sorğusuyla) böyük bir verilənlər bazasını dəyişmək istəyirsənsə mysqldump istifadə edə bilməzsiniz

Percona yaxşı bir şəkildə necə bir blog yazısı var: https://www.percona.com/blog/2013/12/24/renaming-database-schema-mysql/

və Simon R Jones tərəfindən nəşr olunan (hazırlanmış) skript bu mesajda təklif olunanları edir. Ssenaridə tapdığım səhvəni düzəldirdim. Buradan görə bilərsiniz:

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

Bunun bir nüsxəsi:

 #!/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 

rename_db faylında saxla və scriptin çalıştırılabilirini chmod +x rename_db sonra onu istifadə edin ./rename_db localhost old_db new_db

7
09 февр. Cavab ryantm verilir 09 Fevral. 2017-02-09 03:01 '17 də 3:01 2017-02-09 03:01

TodoInTX saxlanılan prosedur mənim üçün işləməyib. İşdə mənə zərbə:

 - saxlanılan prosedurun rename_db: Verilənlər bazasının surətini yenidən adlandırın. - Caveats:  - bir verilənlər bazası adı olacaq. - ONLY nüsxə masaları;  saxlanan prosedurlar və digər verilənlər bazası obyektləri kopyalanmaz. - Tomer Altman (taltman@ai.sri.com) delimiter // DİP PROQRAMI İSTİFADƏ EDİRsə rename_db; PROSEDÜR YARATINIZ rename_db (old_db VARCHAR (100), yeni_db VARCHAR (100)) BEGIN DECLARE current_table VARCHAR (100); DECLARE INT DEFAULT 0 etdi; Table_schema = old_db; data_schema.tables dan table_name seçmək üçün old_tables CURSOR DECLARE; QEYD EDİLMƏSİNƏ HANSI DAVAM EDİR = 1; SET @ çıxış = CONCAT ('DROP SCHEMA IF EXISTS', new_db, ';');  @ Output'dən STMT'ə hazırlaşın; EXECUTE stmt; SET @ çıxış = CONCAT ('CREATE SCHEMA IF EXISTS', new_db, ';'); @ Output'dən STMT'ə hazırlaşın; EXECUTE stmt; OPEN old_tables; REPEAT FİET old_tables INTO current_table; EHTİYATI ETDİ SET @output = CONCAT ('alter masa', old_db, '.', Current_table, 'adını dəyişmək', new_db, '.', Current_table, ';'); @ Output'dən STMT'ə hazırlaşın; EXECUTE stmt; END IF; TƏQDİM EDİLİB END TƏKRARI; KAPALI old_tables; END // bölücü;
7
17 мая '11 в 21:24 2011-05-17 21:24 Cavab 1775-ci il mayın 17-də saat 21 : 24- də istifadəçi tərəfindən verilmişdir

I задал вопрос о сбое сервера , пытаясь обойти время простоя при восстановлении очень больших баз данных с помощью MySQL Proxy. У меня не было никакого успеха, но в конце концов я понял, что я хотел использовать функциональность RENAME DATABASE, потому что dump/import не был вариантом из-за размера нашей базы данных.

Есть функция RENAME TABLE, встроенная в MySQL, поэтому я закончил писать простой Python script, чтобы выполнить эту работу для меня. Я разместил его на GitHub , если он может быть полезен другим.

6
ответ дан cclark 18 апр. '10 в 12:51 2010-04-18 12:51