Manual MySQL di MySQL membahas hal ini.
Biasanya saya hanya membuang database dan menggantinya dengan nama baru. Ini bukan pilihan untuk basis data yang sangat besar. Rupanya RENAME {DATABASE | SCHEMA} db_name TO new_db_name;
melakukan hal-hal buruk, hanya ada di beberapa versi, dan merupakan ide buruk secara keseluruhan .
Ini perlu bekerja dengan InnoDB , yang menyimpan banyak hal berbeda dari MyISAM .
RENAME DATABASE
pernyataan kerja baru yang tidak memiliki bahaya, karena tidak ada cara mudah untuk melakukan tugas ini saat ini. Tidak ada alasan yang jelas mengapa itu berbahaya dalam dokumentasi sehingga mereka harus dapat melakukan penggantian. Setidaknya orang telah memasukkan bug permintaan fitur di situs web mereka. Misalnya, bugs.mysql.com/bug.php?id=58593 dan bugs.mysql.com/bug.php?id=1698 .Jawaban:
Untuk InnoDB , yang berikut ini tampaknya berfungsi: buat database kosong yang baru, lalu ubah nama setiap tabel menjadi database baru:
Anda harus menyesuaikan izin setelah itu.
Untuk skrip di shell, Anda dapat menggunakan salah satu dari berikut ini:
ATAU
Catatan:
-p
dan kata sandi. Jika basis data Anda tidak memiliki kata sandi, hapus-u username -ppassword
bagian tersebut.Jika beberapa tabel memiliki pemicu, itu tidak dapat dipindahkan ke database lain menggunakan metode di atas (akan menghasilkan
Trigger in wrong schema
kesalahan). Jika demikian, gunakan cara tradisional untuk mengkloning database dan kemudian lepaskan yang lama:mysqldump old_db | mysql new_db
Jika Anda memiliki prosedur tersimpan, Anda dapat menyalinnya setelah:
mysqldump -R old_db | mysql new_db
sumber
DROP VIEW
danCREATE VIEW
sebagai gantinya. Canggung, ya. Anda mungkin ingin melakukan amysqldump
untuk memindahkan tampilan, setelah terlebih dahulu memindahkan semua tabel. Perhatikan juga bahwaSHOW TABLES
akan menampilkan tabel DAN tampilan, jadi waspadalah.RENAME DATABASE
dihapus: dev.mysql.com/worklog/task/?id=4030Gunakan beberapa perintah sederhana ini:
Atau untuk mengurangi I / O gunakan yang berikut seperti yang disarankan oleh @Pablo Marin-Garcia:
sumber
-p<password>
alih-alih ke-p
mana - mana sehingga pernyataan berjalan tanpa muncul segera .Enter password: Enter password:
Tampaknya mengambil satu kata sandi, tetapi tidak keduanya. Apakah saya melewatkan detail?--routines
bendera ke perintah mysqldump juga, untuk memastikan bahwa prosedur yang tersimpan disalin.Saya pikir solusinya lebih sederhana dan disarankan oleh beberapa pengembang. phpMyAdmin memiliki operasi untuk ini.
Dari phpMyAdmin, pilih basis data yang ingin Anda pilih. Di tab ada satu yang disebut Operasi, buka bagian ganti nama. Itu saja.
Itu, seperti yang disarankan banyak orang, membuat database baru dengan nama baru, membuang semua tabel dari database lama ke dalam database baru dan menjatuhkan database lama.
sumber
Anda bisa menggunakan SQL untuk menghasilkan skrip SQL untuk mentransfer setiap tabel di basis data sumber Anda ke basis data tujuan.
Anda harus membuat database tujuan sebelum menjalankan skrip yang dihasilkan dari perintah.
Anda dapat menggunakan salah satu dari dua skrip ini (saya awalnya menyarankan yang pertama dan seseorang "meningkatkan" jawaban saya untuk digunakan
GROUP_CONCAT
. Silakan pilih, tapi saya lebih suka yang asli):atau
($ 1 dan $ 2 masing-masing adalah sumber dan target)
Ini akan menghasilkan perintah SQL yang kemudian harus Anda jalankan.
Catatan yang
GROUP_CONCAT
memiliki batas panjang default yang dapat dilampaui untuk database dengan sejumlah besar tabel. Anda dapat mengubah batas itu dengan menjalankanSET SESSION group_concat_max_len = 100000000;
(atau sejumlah besar lainnya).sumber
Meniru
RENAME DATABASE
perintah yang hilang di MySQL:Buat ganti nama kueri dengan:
Jalankan output itu
Itu diambil dari Emulasi The Missing RENAME DATABASE Command di MySQL .
sumber
Tiga opsi:
Buat database baru, bawa server, pindahkan file dari satu folder database ke yang lain, dan restart server. Perhatikan bahwa ini hanya akan berfungsi jika SEMUA tabel Anda adalah MyISAM.
Buat database baru, gunakan CREATE TABLE ... LIKE pernyataan, dan kemudian gunakan INSERT ... SELECT * FROM pernyataan.
Gunakan mysqldump dan muat ulang dengan file itu.
sumber
Cara sederhana
Ubah ke direktori basis data:
Matikan MySQL ... Ini penting!
Oke, cara ini tidak berfungsi untuk InnoDB atau BDB-Databases.
Ganti nama basis data:
... atau meja ...
Mulai ulang MySQL
Selesai ...
Oke, cara ini tidak berfungsi dengan database InnoDB atau BDB. Dalam hal ini Anda harus membuang database dan mengimpornya kembali.
sumber
launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist cd /usr/local/var/mysql mv old-name new-name launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
Anda dapat menggunakan skrip shell ini:
Referensi: Bagaimana cara mengganti nama database MySQL?
Bekerja:
sumber
set -e
ke awal skrip, yang akan menyebabkan eksekusi berakhir pada kegagalan dan harus mengurangi masalah itu.Saya baru-baru ini menemukan cara yang sangat bagus untuk melakukannya, bekerja dengan MyISAM dan InnoDB dan sangat cepat:
Saya tidak ingat di mana saya membacanya tetapi kredit jatuh kepada orang lain, bukan saya.
sumber
Cara paling mudah untuk membuktikan nama lengkap (termasuk menjatuhkan basis data lama di bagian akhir sehingga merupakan ganti nama daripada salinan) :
Langkah:
sumber
Inilah yang saya gunakan:
sumber
MySQL tidak mendukung penggantian nama database melalui antarmuka perintahnya saat ini, tetapi Anda dapat mengganti nama database jika Anda memiliki akses ke direktori tempat MySQL menyimpan databasenya. Untuk instalasi MySQL default ini biasanya di direktori Data di bawah direktori di mana MySQL diinstal. Temukan nama database yang ingin Anda ganti namanya di bawah direktori Data dan ganti namanya. Mengganti nama direktori dapat menyebabkan beberapa masalah izin. Waspadalah.
Catatan: Anda harus menghentikan MySQL sebelum Anda dapat mengganti nama database
Saya akan merekomendasikan membuat database baru (menggunakan nama yang Anda inginkan) dan mengekspor / mengimpor data yang Anda butuhkan dari yang lama ke yang baru. Cukup mudah.
sumber
Ketika Anda mengganti nama database di PHPMyAdmin itu membuat dump, lalu turun dan buat ulang database dengan nama baru.
sumber
Nah ada 2 metode:
Metode 1: Metode yang terkenal untuk mengganti nama skema database adalah dengan membuang skema menggunakan Mysqldump dan mengembalikannya ke skema lain, dan kemudian menjatuhkan skema lama (jika diperlukan).
Dari Shell
Meskipun metode di atas mudah, itu memakan waktu dan ruang. Bagaimana jika skema lebih dari 100GB? Ada metode di mana Anda dapat menyatukan perintah-perintah di atas untuk menghemat ruang, namun itu tidak akan menghemat waktu.
Untuk memperbaiki situasi seperti itu, ada metode cepat lain untuk mengubah nama skema, namun, beberapa kehati-hatian harus diambil saat melakukannya.
Metode 2: MySQL memiliki fitur yang sangat bagus untuk mengganti nama tabel yang bahkan berfungsi di berbagai skema. Operasi penggantian nama ini bersifat atomik dan tidak ada orang lain yang dapat mengakses tabel sementara namanya diubah. Ini membutuhkan waktu singkat untuk diselesaikan karena mengubah nama tabel atau skemanya hanyalah perubahan metadata. Berikut ini adalah pendekatan prosedural dalam melakukan penggantian nama:
Buat skema database baru dengan nama yang diinginkan. Ganti nama tabel dari skema lama ke skema baru, menggunakan perintah MySQL "RENAME TABLE". Jatuhkan skema database lama.
If there are views, triggers, functions, stored procedures in the schema, those will need to be recreated too
. “RENAME TABLE” MySQL gagal jika ada pemicu pada tabel. Untuk memperbaiki ini kita dapat melakukan hal-hal berikut:1)
Dump the triggers, events and stored routines in a separate file.
Ini dilakukan menggunakan flag -E, -R (selain -t -d yang membuang trigger) ke perintah mysqldump. Setelah pemicu dibuang, kita harus membuangnya dari skema, agar perintah RENAME TABLE berfungsi.2) Hasilkan daftar hanya "BASE" tabel. Ini dapat ditemukan menggunakan kueri di atas
information_schema.TABLES
meja.3) Buang tampilan dalam file keluar. Tampilan dapat ditemukan menggunakan kueri di
information_schema.TABLES
tabel yang sama .4) Jatuhkan pemicu pada tabel saat ini di old_schema.
5) Kembalikan file dump di atas setelah semua tabel "Base" yang ditemukan di langkah # 2 diganti namanya.
Seluk-beluk dengan metode di atas: Kami mungkin perlu memperbarui GRAN untuk pengguna sehingga mereka cocok dengan schema_name yang benar. Ini dapat diperbaiki dengan PEMBARUAN sederhana di mysql.columns_priv, mysql.procs_priv, mysql.tables_priv, tabel mysql.db memperbarui nama old_schema ke new_schema dan memanggil "Flush privilege;". Meskipun “metode 2 ″ tampaknya sedikit lebih rumit daripada“ metode 1 ″, ini sepenuhnya bisa skrip. Skrip bash sederhana untuk melakukan langkah-langkah di atas dalam urutan yang tepat, dapat membantu Anda menghemat ruang dan waktu saat mengganti nama skema basis data di waktu berikutnya.
Tim Percona Remote DBA telah menulis skrip yang disebut "rename_db" yang bekerja dengan cara berikut:
Untuk mendemonstrasikan penggunaan skrip ini, gunakan skema sampel "emp", pencetus tes yang dibuat, rutin yang tersimpan pada skema tersebut. Akan mencoba mengubah nama skema database menggunakan skrip, yang membutuhkan beberapa detik untuk menyelesaikannya dibandingkan dengan metode dump / restore yang memakan waktu.
Seperti yang Anda lihat dalam output di atas skema database "emp" diubah namanya menjadi "emp_test" dalam waktu kurang dari satu detik. Terakhir, Ini adalah skrip dari Percona yang digunakan di atas untuk "metode 2".
sumber
Langkah :
sumber
Bagi mereka yang pengguna Mac, Sequel Pro memiliki opsi Rename Database di menu Database. http://www.afterelpro.com/
sumber
Sebagian besar jawaban di sini salah karena satu dari dua alasan:
Percona memiliki posting blog tentang bagaimana melakukan ini dengan baik: https://www.percona.com/blog/2013/12/24/renaming-database-schema-mysql/
dan skrip diposting (dibuat?) oleh Simon R Jones yang melakukan apa yang disarankan dalam posting itu. Saya memperbaiki bug yang saya temukan di skrip. Anda bisa melihatnya di sini:
https://gist.github.com/ryantm/76944318b0473ff25993ef2a7186213d
Ini salinannya:
Simpan ke file yang dipanggil
rename_db
dan buat skripnya dapat dieksekusichmod +x rename_db
lalu gunakan seperti itu./rename_db localhost old_db new_db
sumber
Dimungkinkan untuk mengganti nama semua tabel di dalam basis data agar berada di bawah basis data lain tanpa harus melakukan dump dan restore penuh.
Namun pemicu dalam target db tidak akan bahagia. Anda harus menjatuhkannya terlebih dahulu kemudian membuatnya kembali setelah mengganti nama.
sumber
mysql --batch-uroot -e "call mysql.rename_db('test', 'blah2');" | mysql -uroot
Perhatikan, Anda harus menggunakan --batch untuk mengubah pemformatan menjadi pemformatan mentah yang menghasilkan hasil dengan pemformatan w / nolIni adalah file batch yang saya tulis untuk mengotomatiskannya dari baris perintah, tetapi untuk Windows / MS-DOS.
Sintaksnya adalah rename_mysqldb database newdatabase -u [pengguna] -p [kata sandi]
sumber
Prosedur yang disimpan TodoInTX tidak berhasil bagi saya. Inilah tikaman saya padanya:
sumber
Metode paling sederhana adalah dengan menggunakan perangkat lunak HeidiSQL. Ini gratis dan open source. Ini berjalan di Windows dan di Linux apa saja dengan Wine (menjalankan aplikasi Windows di Linux, BSD, Solaris dan Mac OS X).
Untuk mengunduh HeidiSQL, goto http://www.heidisql.com/download.php .
Untuk mengunduh Wine, goto http://www.winehq.org/ .
Untuk mengganti nama database di HeidiSQL, cukup klik kanan pada nama database dan pilih 'Edit'. Kemudian masukkan nama baru dan tekan 'OK'.
Ini sangat sederhana.
sumber
Database "database_name" contains stored routine(s) which cannot be moved.
Pemicu (setidaknya untuk database MariDB) dihitung sebagai rutinitas tersimpan. Saya tidak memiliki prosedur tersimpan, tetapi tidak dapat mengubah nama database sampai saya membatalkan semua pemicu.Untuk pengguna mac, Anda dapat menggunakan
Sequel Pro
(gratis), yang hanya menyediakan opsi untuk mengganti nama Database. Meskipun itu tidak menghapus DB yang lama.setelah membuka DB yang relevan cukup klik:
Database
->Rename database...
sumber
Saya mengajukan pertanyaan pada Server Fault yang mencoba menyiasati waktu henti ketika memulihkan basis data yang sangat besar dengan menggunakan MySQL Proxy. Saya tidak berhasil, tetapi pada akhirnya saya menyadari apa yang saya inginkan adalah fungsionalitas RENAME DATABASE karena dump / impor bukan pilihan karena ukuran basis data kami.
Ada fungsi RENAME TABLE yang terpasang di MySQL, jadi saya akhirnya menulis skrip Python sederhana untuk melakukan pekerjaan itu untuk saya. Saya telah mempostingnya di GitHub kalau-kalau itu bisa berguna bagi orang lain.
sumber
RENAME TABLE
, bahwa pernyataan ini ditambahkan di MySQL 5.1.7 tetapi ternyata berbahaya dan dihapus di MySQL 5.1.23.Untuk kenyamanan Anda, di bawah ini adalah shellscript kecil yang harus dijalankan dengan dua parameter: db-name dan new db-name.
Anda mungkin perlu menambahkan parameter login ke mysql-lines jika Anda tidak menggunakan file .my.cnf di direktori home Anda. Harap buat cadangan sebelum menjalankan skrip ini.
sumber
Sepertinya tidak ada yang menyebutkan ini, tetapi di sini ada cara lain:
maka untuk setiap tabel lakukan:
maka, jika Anda ingin,
Pendekatan ini akan memiliki keuntungan melakukan seluruh transfer pada server dengan lalu lintas jaringan mendekati nol, sehingga akan jauh lebih cepat daripada dump / restore.
Jika Anda memiliki prosedur / tampilan / etc yang tersimpan, Anda mungkin ingin mentransfernya juga.
sumber
create database
pernyataan? Dari mana Anda mendapatkan itu?create table like
sintaks: dev.mysql.com/doc/refman/5.7/en/create-table-like.html . Adapun untuk membuat database seperti, sepertinya MySQL menjatuhkan klausa itu sejak.Berikut adalah cara cepat untuk membuat nama skrip sql, jika Anda memiliki banyak tabel untuk dipindahkan.
sumber
ALTER DATABASE
adalah cara yang diusulkan untuk hal ini oleh MySQL danRENAME DATABASE
dijatuhkan.Dari 13.1.32 RENAME DATABASE Syntax :
Pernyataan ini ditambahkan di MySQL 5.1.7, tetapi ternyata berbahaya dan dihapus di MySQL 5.1.23.
sumber
alter database
untuk mengganti nama database itu sendiri, dan dokumentasi yang Anda tautkan tidak menyarankan itu mungkin.Di MySQL Administrator, lakukan hal berikut:
sumber
di phpmyadmin Anda dapat dengan mudah mengganti nama basis data
minta untuk menjatuhkan tabel lama dan memuat kembali data tabel klik OK di keduanya
Basis data Anda diganti namanya
sumber
Jika Anda menggunakan phpMyAdmin Anda dapat pergi ke tab "operasi" setelah Anda memilih database yang ingin Anda ganti namanya. Lalu pergi ke bagian terakhir "salin database ke" (atau sesuatu seperti itu), beri nama, dan pilih opsi di bawah ini. Dalam hal ini, saya kira Anda harus memilih "struktur dan data" dan "buat database sebelum menyalin" kotak centang dan, akhirnya, tekan tombol "pergi" di bagian itu.
Ngomong-ngomong, saya menggunakan phpMyAdmin dalam bahasa Spanyol jadi saya tidak yakin nama-nama bagian dalam bahasa Inggris.
sumber