Bagaimana cara cepat mengganti nama database MySQL (ubah nama skema)?


959

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 .



5
Pernyataan ini RENAME DATABASE Syntax ditambahkan di MySQL 5.1.7 tetapi ternyata berbahaya dan dihapus di MySQL 5.1.23.
zloctb

11
Semoga MySQL akan menerapkan RENAME DATABASEpernyataan 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 .
Edward

tautan sekarang terputus ...
oldboy

Jawaban:


833

Untuk InnoDB , yang berikut ini tampaknya berfungsi: buat database kosong yang baru, lalu ubah nama setiap tabel menjadi database baru:

RENAME TABLE old_db.table TO new_db.table;

Anda harus menyesuaikan izin setelah itu.

Untuk skrip di shell, Anda dapat menggunakan salah satu dari berikut ini:

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

ATAU

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;

Catatan:

  • Tidak ada ruang antara opsi -pdan kata sandi. Jika basis data Anda tidak memiliki kata sandi, hapus -u username -ppasswordbagian tersebut.
  • Jika beberapa tabel memiliki pemicu, itu tidak dapat dipindahkan ke database lain menggunakan metode di atas (akan menghasilkan Trigger in wrong schemakesalahan). 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


26
Saya baru saja melakukan ini dengan database InnoDB dengan 30+ tabel, menggunakan pengaturan file_per_table, dan meskipun beberapa tabel 3+ juta baris, selesai dalam <1 detik. Sepertinya memindahkan file pada penyimpanan, daripada melakukan sesuatu yang lebih rumit ... +2 jika mungkin :)
Dave Rix

87
"RENAME DATABASE ditemukan berbahaya dan dihapus di MySQL 5.1.23
Palani

13
Harap perhatikan bahwa ini tidak akan berfungsi untuk tampilan. Anda tidak dapat mengubah nama tampilan untuk membuatnya berpindah dari database ke yang lain. Gunakan DROP VIEWdan CREATE VIEWsebagai gantinya. Canggung, ya. Anda mungkin ingin melakukan a mysqldumpuntuk memindahkan tampilan, setelah terlebih dahulu memindahkan semua tabel. Perhatikan juga bahwa SHOW TABLESakan menampilkan tabel DAN tampilan, jadi waspadalah.
tuomassalo

9
Juga ini tidak akan berfungsi untuk tabel dengan pemicu apa pun. Anda perlu menemukan, membuang, dan menjatuhkan pemicu sebelum memindahkan tabel, lalu mengimpor pemicu yang dibuang ke target db.
Olfan

5
Tautan yang diperbarui (yaitu berfungsi) yang mendokumentasikan mengapa RENAME DATABASEdihapus: dev.mysql.com/worklog/task/?id=4030
alexis

443

Gunakan beberapa perintah sederhana ini:

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

Atau untuk mengurangi I / O gunakan yang berikut seperti yang disarankan oleh @Pablo Marin-Garcia:

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

86
Seperti kata OP, "itu bukan pilihan untuk database yang sangat besar."
pilcrow

3
Jangan lupa untuk MENGURANGI database asli
Pavel Radzivilovsky

3
Jawaban yang brilian! Beberapa saran untuk lebih ditingkatkan karena ini mungkin sedang di-google-kan oleh semua kemampuan: (1) Pindahkan fragmen kode Pablo Marin-Garcia ke atas karena tampaknya jawaban terbaik (2) Masukkan -p<password>alih-alih ke -pmana - mana sehingga pernyataan berjalan tanpa muncul segera .
Steve Chambers

9
Menggunakan versi pipa saya mendapatkan dua "Masukkan kata sandi:" meminta seperti ini: Enter password: Enter password: Tampaknya mengambil satu kata sandi, tetapi tidak keduanya. Apakah saya melewatkan detail?
Ryan

33
Saya terkejut bahwa tidak ada yang menyebutkan ini, tetapi Anda benar-benar harus menambahkan --routinesbendera ke perintah mysqldump juga, untuk memastikan bahwa prosedur yang tersimpan disalin.
Carlos P

205

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.

Masukkan deskripsi gambar di sini


76
Dengan asumsi Anda bahkan memiliki php di lingkungan Anda atau menggunakan phpmyadmin.
Chris

26
Cukup berbahaya bahkan jika Anda memiliki phpMyAdmin - ujung belakang bisa gagal pada pertengahan proses meninggalkan dua dbs dalam keadaan yang tidak diketahui, atau itu bisa memakan waktu yang sangat lama, mengarah ke menggantung front-end atau waktu PHP keluar.
mozboz

20
Itu benar @ mozboz, tapi saya sudah melakukan ini selama 10 tahun dan tidak pernah punya masalah itu. Apakah sama jika Anda menjalankan perintah melalui shell dan komputer Anda crash. Ada kemungkinan tapi apa? 1 banding 1 kuadriliun?
raphie

24
Sebuah skrip via konsol juga merupakan ujung depan yang dapat diatasi dengan masalah yang sama.
Greg

11
Namun operasi konsol jauh lebih dapat diandalkan daripada PhpMyAdmin, terutama di mana basis data besar terlibat, yang merupakan kasus OP. Secara pribadi saya akan sangat menyarankan metode konsol daripada PMA jika Anda memiliki basis data yang cukup besar. Tak perlu dikatakan, pada database kecil PMA sama baiknya.
Teodor Sandu

107

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):

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

atau

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

($ 1 dan $ 2 masing-masing adalah sumber dan target)

Ini akan menghasilkan perintah SQL yang kemudian harus Anda jalankan.

Catatan yang GROUP_CONCATmemiliki batas panjang default yang dapat dilampaui untuk database dengan sejumlah besar tabel. Anda dapat mengubah batas itu dengan menjalankan SET SESSION group_concat_max_len = 100000000;(atau sejumlah besar lainnya).


@BlakeFrederick Tidak menggunakan RENAME DATABASE, jadi apa masalahnya?
tuxayo

Apakah ini berfungsi jika tabel memiliki batasan referensial? Saya harap tidak.
dolmen

42

Meniru RENAME DATABASEperintah yang hilang di MySQL:

  1. Buat database baru
  2. Buat ganti nama kueri dengan:

    SELECT CONCAT('RENAME TABLE ',table_schema,'.',table_name,
        ' TO ','new_schema.',table_name,';')
    FROM information_schema.TABLES
    WHERE table_schema LIKE 'old_schema';
  3. Jalankan output itu

  4. Hapus basis data lama

Itu diambil dari Emulasi The Missing RENAME DATABASE Command di MySQL .


1
Sempurna! Saya menguji ini dengan tabel InnoDB dan MyISAM. Solusi tercepat yang saya uji (mengganti nama tabel hampir instan, tanpa penundaan)!
Philipp

Bagus! Ingatlah untuk memperbaiki hak istimewa setelahnya.
Adam Faryna

ps. Lebih baik lakukan ini sebelum Anda menjalankan permintaan ganti nama jika Anda bekerja pada DB hidup.
Adam Faryna

Apakah ini berfungsi jika tabel memiliki batasan referensial? Saya harap tidak.
dolmen

24

Tiga opsi:

  1. 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.

  2. Buat database baru, gunakan CREATE TABLE ... LIKE pernyataan, dan kemudian gunakan INSERT ... SELECT * FROM pernyataan.

  3. Gunakan mysqldump dan muat ulang dengan file itu.


+ untuk referensi myisam. Saya tidak tahu mengapa ini tidak berhasil untuk saya.
Christian Payne

5
Pertanyaannya menyatakan bahwa ini harus bekerja untuk InnoDB, bukan MyISAM
D-Rock

@ D-Rock mengatakan itu ke Google, yang membawa orang ke sini berdasarkan judul.
jiggunjer

24

Cara sederhana

Ubah ke direktori basis data:

cd /var/lib/mysql/

Matikan MySQL ... Ini penting!

/etc/init.d/mysql stop

Oke, cara ini tidak berfungsi untuk InnoDB atau BDB-Databases.

Ganti nama basis data:

mv old-name new-name

... atau meja ...

cd database/

mv old-name.frm new-name.frm

mv old-name.MYD new-name.MYD

mv old-name.MYI new-name.MYI

Mulai ulang MySQL

/etc/init.d/mysql start

Selesai ...

Oke, cara ini tidak berfungsi dengan database InnoDB atau BDB. Dalam hal ini Anda harus membuang database dan mengimpornya kembali.


16
Mengganti nama folder akan merusak mainan.
ViniciusPires

1
@ Sebenarnya, bahkan jika satu file per tabel diatur, masih berbahaya, tabel yang dibuat sebelum satu file per tabel diatur akan bermasalah, kecuali Anda tahu pasti bahwa basis data dibuat setelah bendera ditetapkan.
Qian Chen,

Namun secara umum, kebanyakan orang akan memiliki sistem mereka dengan satu atau lain cara, orang tidak akan secara acak membalik-balik apakah memiliki atau tidak memiliki satu tabel per file. Selain itu, bahkan dalam skenario Anda, jika tabel dibuat sebelum bendera, mereka tidak akan ada sebagai file terpisah di tempat pertama, sehingga langkah itu tidak akan berhasil dan masih aman, tidak ada bahaya. Ingat, basis data TIDAK berjalan saat perpindahan sedang berlangsung.
Rahly

Setara dengan mysql diinstal dengan homebrew pada OS X: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
coberlin

22

Anda dapat menggunakan skrip shell ini:

Referensi: Bagaimana cara mengganti nama database MySQL?

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

Bekerja:

$ sh rename_database.sh oldname newname

6
Hati-hati dengan ini. Jika Anda tidak masuk dengan pengguna root, Anda mungkin memiliki izin terbatas. Menyebabkan penggantian nama menjadi gagal tetapi penurunan untuk berhasil menghasilkan database yang jatuh. Naskah yang bagus sebaliknya.
Lex

3
Saya menambahkan set -eke awal skrip, yang akan menyebabkan eksekusi berakhir pada kegagalan dan harus mengurangi masalah itu.
Mikkel

19

Saya baru-baru ini menemukan cara yang sangat bagus untuk melakukannya, bekerja dengan MyISAM dan InnoDB dan sangat cepat:

RENAME TABLE old_db.table TO new_db.table;

Saya tidak ingat di mana saya membacanya tetapi kredit jatuh kepada orang lain, bukan saya.


@ArkadijKuzhel tidak berpikir begitu. Saya pikir Anda sedang berbicara tentang DATABASE RENAME.
Rob Grant

Ini sangat membantu, saya membuat Database kosong baru dan kemudian menggunakan kode, semua tabel diimpor dengan nama yang diinginkan.
JulyOrdinary

3
Ini mengalami masalah yang sama dengan jawaban yang diterima - "RENAME DATABASE ditemukan berbahaya dan dihapus di MySQL 5.1.23" - dari dev.mysql.com/doc/refman/5.1/en/rename-database.html
Blake Frederick

16

Cara paling mudah untuk membuktikan nama lengkap (termasuk menjatuhkan basis data lama di bagian akhir sehingga merupakan ganti nama daripada salinan) :

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

Langkah:

  1. Salin garis ke Notepad.
  2. Ganti semua referensi ke "olddbname", "newdbname", "mypassword" (+ opsional "root") dengan padanan Anda.
  3. Jalankan satu per satu di baris perintah (memasukkan "y" saat diminta).

Hindari menambahkan kata sandi Anda ke konsol karena tidak aman. Jika Anda sudah melakukan ini, gunakan history -cw untuk menghapus. Alih-alih biarkan kata sandi kosong dan masukkan setelah diperintahkan.
Tommie C.

Diperlukan waktu yang tidak normal, lebih dari 20 menit tanpa selesai. Apakah saya boleh membatalkan?
Sigu Magwa

15

Inilah yang saya gunakan:

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

14
Tidak bisa dilakukan untuk database besar.
mikesl

14

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.


13

Ketika Anda mengganti nama database di PHPMyAdmin itu membuat dump, lalu turun dan buat ulang database dengan nama baru.


4
Perhatikan bahwa fitur ini sedikit tersembunyi di bawah tab "Operasi", ketika Anda mengklik database.
Maris B.

13

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

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

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.

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

2) Hasilkan daftar hanya "BASE" tabel. Ini dapat ditemukan menggunakan kueri di atas information_schema.TABLESmeja.

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

3) Buang tampilan dalam file keluar. Tampilan dapat ditemukan menggunakan kueri di information_schema.TABLEStabel yang sama .

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) Jatuhkan pemicu pada tabel saat ini di old_schema.

mysql> DROP TRIGGER <trigger_name>;
...

5) Kembalikan file dump di atas setelah semua tabel "Base" yang ditemukan di langkah # 2 diganti namanya.

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

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:

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

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.

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

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".

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

Bagaimana dengan batasan referensial?
dolmen

13

Langkah :

  1. Tekan http: // localhost / phpmyadmin /
  2. Pilih DB Anda
  3. Klik pada Tab Operasi
  4. Akan ada tab sebagai "Ubah nama basis data menjadi". Tambahkan nama baru dan centang Sesuaikan hak istimewa.
  5. Klik Go.

masukkan deskripsi gambar di sini


1
Solusi phpMyAdmin biasanya merupakan solusi yang buruk karena beberapa lingkungan memiliki lingkungan terbatas.
Daniel Antunes Pinto

Bukan solusi "baik" tapi terima kasih karena itu yang saya cari.
jamie

1
Harap berikan suara jika itu berfungsi untuk Anda .. itu akan membantu .. terima kasih
Shubham Jain

1
Ini berfungsi untuk saya, di lingkungan phpMyAdmin, +1
William

12

Bagi mereka yang pengguna Mac, Sequel Pro memiliki opsi Rename Database di menu Database. http://www.afterelpro.com/


5
Waspadai opsi ini jika Anda memiliki pandangan atau pemicu di basis data Anda. Di belakang opsi menu ini adalah skrip yang akan membuat database baru dan memindahkan semua tabel. Ini tidak akan berfungsi untuk tampilan atau pemicu, sehingga mereka akan tertinggal di database lama Anda. Hasilnya adalah dua database yang rusak yang perlu diperbaiki.
Olfan

10

Sebagian besar jawaban di sini salah karena satu dari dua alasan:

  1. Anda tidak bisa hanya menggunakan RENAME TABLE, karena mungkin ada tampilan dan pemicu. Jika ada pemicu, RENAME TABLE gagal
  2. Anda tidak dapat menggunakan mysqldump jika Anda ingin "cepat" (seperti yang diminta dalam pertanyaan) mengganti nama database besar

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:

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

Simpan ke file yang dipanggil rename_dbdan buat skripnya dapat dieksekusi chmod +x rename_dblalu gunakan seperti itu./rename_db localhost old_db new_db


Saya suka skrip ini, hampir universal. Namun gagal untuk memproses kasus ketika ada beberapa VIEW dirantai di mana definisi tidak root.
ENargit

9

Dimungkinkan untuk mengganti nama semua tabel di dalam basis data agar berada di bawah basis data lain tanpa harus melakukan dump dan restore penuh.

PROSEDUR DROP JIKA ADA mysql.rename_db;
DELIMITER ||
CREATE PROCEDURE mysql.rename_db (IN old_db VARCHAR (100), IN new_db VARCHAR (100))
MULAI
SELECT CONCAT ('CREATE DATABASE', new_db, ';') `# buat database baru`;
SELECT CONCAT ('RENAME TABLE `', old_db, '` .`', table_name, '`TO`', new_db, '`.`', table_name, '`;') `# alter table` DARI information_schema.tables WHERE table_schema = old_db;
SELECT CONCAT ('DROP DATABASE `', old_db, '`;') `# drop database lama`;
AKHIR ||
PEMBATAS;

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

Namun pemicu dalam target db tidak akan bahagia. Anda harus menjatuhkannya terlebih dahulu kemudian membuatnya kembali setelah mengganti nama.

mysql -uroot -e "panggil mysql.rename_db ('test', 'blah2');" | mysql -uroot
GALAT 1435 (HY000) pada baris 4: Pemicu dalam skema yang salah

tweak kecil yang membuat ini bekerja dengan mysql 5.x 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 / nol
mikesl

8

Ini 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]

:: ***************************************************************************
:: 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

Prosedur yang disimpan TodoInTX tidak berhasil bagi saya. Inilah tikaman saya padanya:

- prosedur tersimpan rename_db: Ganti nama database dengan cara saya menyalin tabel.
- Peringatan: 
- Akan menghancurkan basis data yang ada dengan nama yang sama dengan nama basis data 'baru'.
- HANYA menyalin tabel; prosedur tersimpan dan objek database lainnya tidak disalin.
- Tomer Altman (taltman@ai.sri.com)

pembatas //
PROSEDUR DROP JIKA ADA rename_db;
CREATE PROCEDURE rename_db (IN old_db VARCHAR (100), IN new_db VARCHAR (100))
MULAI
    DECLARE current_table VARCHAR (100);
    PERNYATAAN dilakukan INT DEFAULT 0;
    DECLARE old_tables CURSOR FOR pilih table_name dari information_schema.tables di mana table_schema = old_db;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

    SET @output = CONCAT ('DROP SCHEMA IF EXISTS', new_db, ';'); 
    SIAPKAN STMT DARI @output;
    EXECUTE stmt;

    SET @output = CONCAT ('CREATE SCHEMA IF NOT EXISTS', new_db, ';');
    SIAPKAN STMT DARI @output;
    EXECUTE stmt;

    BUKA old_tables;
    ULANG
        FETCH old_tables KE current_table;
        JIKA TIDAK dilakukan maka
        SET @output = CONCAT ('alter table', old_db, '.', Current_table, 'rename', new_db, '.', Current_table, ';');
        SIAPKAN STMT DARI @output;
        EXECUTE stmt;

        BERAKHIR JIKA;
    SAMPAI melakukan END REPEAT;

    TUTUP old_tables;

AKHIR//
pembatas;

Ini hanya akan berfungsi untuk tabel, dan hanya jika tabel ini tidak memiliki pemicu. Tampilan dan pemicu tidak akan dipindahkan oleh ini.
Olfan

7

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.


1
Jika telah menyimpan prosedur, itu tidak dapat diubah namanya.
abksharma

@abksharma Sebenarnya Anda akan mendapatkan pesan 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.
izogfif

7

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


Terkadang DB lama tetap hidup tetapi kosong. Namun, jika itu membuat salinan, Anda dapat membuat salinan dan menghapus yang lama, itu masih 2 langkah sederhana.
Roee Gavirel

6

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.



2
RENAME DATABASE dikeluarkan dari sintaks, bukan RENAME TABLE.
Duke

6

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.


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

1
Ini juga tidak akan berfungsi untuk tabel dengan pemicu yang dilampirkan, atau untuk tampilan yang tidak dapat diubah namanya menjadi database lain.
Olfan

6

Sepertinya tidak ada yang menyebutkan ini, tetapi di sini ada cara lain:

create database NewDatabaseName like OldDatabaseName;

maka untuk setiap tabel lakukan:

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

maka, jika Anda ingin,

drop database OldDatabaseName;

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.


2
Sejauh yang saya tahu 5.x tidak mendukung kata kunci "seperti" dalam create databasepernyataan? Dari mana Anda mendapatkan itu?
Dragas

Berikut ini tautan untuk create table likesintaks: dev.mysql.com/doc/refman/5.7/en/create-table-like.html . Adapun untuk membuat database seperti, sepertinya MySQL menjatuhkan klausa itu sejak.
Tuncay Göncüoğlu

4

Berikut adalah cara cepat untuk membuat nama skrip sql, jika Anda memiliki banyak tabel untuk dipindahkan.

SELECT DISTINCT CONCAT('RENAME TABLE ', t.table_schema,'.', t.table_name, ' TO ',     
t.table_schema, "_archive", '.', t.table_name, ';' ) as Rename_SQL 
FROM information_schema.tables t
WHERE table_schema='your_db_name' ;

Terlihat bagus, tetapi ini tidak memindahkan prosedur atau tampilan yang tersimpan.
davidpricedev

Anda mungkin harus menambahkan tanda pagar untuk membungkus nama tabel dan nama skema
Funkodebat

4

ALTER DATABASEadalah cara yang diusulkan untuk hal ini oleh MySQL dan RENAME DATABASEdijatuhkan.

Dari 13.1.32 RENAME DATABASE Syntax :

RENAME {DATABASE | SCHEMA} db_name TO new_db_name;

Pernyataan ini ditambahkan di MySQL 5.1.7, tetapi ternyata berbahaya dan dihapus di MySQL 5.1.23.


7
Apakah Anda memiliki sintaks contoh? Saya tidak tahu cara apa pun alter databaseuntuk mengganti nama database itu sendiri, dan dokumentasi yang Anda tautkan tidak menyarankan itu mungkin.
Jordan

@ Jordan, aku juga tertarik. Saya mencoba dan mencoba dan menemukan, bahwa itu hanya berfungsi dengan versi> 5.1 tetapi saya tidak dapat memperbarui sekarang.
fancyPants

5
-1: Untuk menulis tentang cara-cara yang diusulkan, kemudian memberikan contoh cara yang tidak diusulkan sementara sama sekali tidak ada untuk menunjukkan contoh.
hakre

3
Ini salah. Dokumentasi rename database MySQL mengatakan rename_database dimaksudkan untuk tugas penggantian nama yang sangat spesifik (bukan kasus umum penggantian nama DB), yang sekarang ditangani dengan alter database: 'Untuk melakukan tugas meningkatkan nama database dengan pengkodean baru, gunakan ALTER DATABASE db_name UPGRADE Alih-alih, NAMA DIRECTORY DATA 'Anda tidak dapat menggunakan ini untuk mengubah nama database seperti yang Anda inginkan, bahkan tidak ada tempat untuk nama db baru dalam perintah ini!
Kanat Bolazar

3

Di MySQL Administrator, lakukan hal berikut:

  1. Di bawah Katalog, buat skema database baru.
  2. Pergi ke Cadangan dan buat cadangan dari skema lama.
  3. Jalankan cadangan.
  4. Pergi ke Kembalikan dan buka file yang dibuat pada langkah 3.
  5. Pilih 'Skema Lain' di bawah Skema Target dan pilih skema database baru.
  6. Mulai Kembalikan.
  7. Verifikasi skema baru dan, jika terlihat bagus, hapus yang lama.

Administrator MySQL tidak dapat menangani database besar dan tidak ada yang cepat tentang hal itu
deadprogrammer

3

di phpmyadmin Anda dapat dengan mudah mengganti nama basis data

select database 

  goto operations tab

  in that rename Database to :

  type your new database name and click go

minta untuk menjatuhkan tabel lama dan memuat kembali data tabel klik OK di keduanya

Basis data Anda diganti namanya


3

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.