<?php
//connect your database here first
//// Actual code starts here
$sql ="SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'your_database_name'
AND ENGINE = 'MyISAM'";$rs = mysql_query($sql);while($row= mysql_fetch_array($rs)){$tbl =$row[0];$sql ="ALTER TABLE `$tbl` ENGINE=INNODB";
mysql_query($sql);}?>
Mungkin akan lebih baik untuk membatasi ini ke database yang Anda fokuskan. Tambahkan "AND TABLE_SCHEMA = 'dbname', kalau tidak, ini bisa / akan mengubah semua tabel MySQL internet menjadi innodb juga (ketika beberapa dari mereka seharusnya menjadi memori)
Mie
7
mysql_*Antarmuka PHP sudah usang dan dihapus dari ver 7. Jangan gunakan kode ini apa adanya.
Rick James
4
@GajendraBang - Ya, jawabannya valid saat disajikan. Tetapi untuk pendatang baru, itu tidak berlaku lagi. Maksud saya adalah untuk memperingatkan agar tidak menggunakannya sebagaimana adanya .
Rick James
1
Pertanyaannya tidak menyebutkan PHP apa pun
phil294
1
Bagaimana pengeditan terbaru tidak ditandai? Bagian MySQL adalah salinan langsung dari jawaban Will Jones. Lihatlah setiap edit sejarah untuk menemukan bahwa jawaban Will muncul pada 2013 sementara jawaban ini muncul pada 2019. Akibatnya, integritas pertanyaan ini terganggu.
rmutalik
549
Jalankan pernyataan SQL ini (di klien MySQL, phpMyAdmin, atau di mana pun) untuk mengambil semua tabel MyISAM di database Anda.
Ganti nilai name_of_your_dbvariabel dengan nama basis data Anda.
SET@DATABASE_NAME ='name_of_your_db';SELECT CONCAT('ALTER TABLE `', table_name,'` ENGINE=InnoDB;')AS sql_statements
FROM information_schema.tables AS tb
WHERE table_schema =@DATABASE_NAME
AND`ENGINE`='MyISAM'AND`TABLE_TYPE`='BASE TABLE'ORDERBY table_name DESC;
Kemudian, salin output dan jalankan sebagai kueri SQL baru.
"# 1267 campuran ilegal dari koleksi ..." Saya mendapatkan kesalahan ini, tidak berfungsi
Rápli András
1
Hanya karena penasaran, apa gunanya pemesanan turun secara eksplisit? ( ORDER BY table_name DESC)
rinogo
12
Jika Anda berurusan dengan banyak basis data dan tidak ingin mengubah basis data setiap saat, ubah CONCAT('ALTER TABLE ', table_name, ' ENGINE=InnoDB;')keCONCAT('ALTER TABLE ',@DATABASE_NAME,'.', table_name, ' ENGINE=InnoDB;')
ub3rst4r
1
Jika Anda ingin mendapatkan pernyataan untuk semua database (kecuali database sistem MySQL): SELECT CONCAT('ALTER TABLE `', table_schema, '`.`', table_name, '` ENGINE=InnoDB;') AS sql_statements FROM information_schema.tables WHERE table_schema NOT IN ('information_schema', 'performance_schema', 'mysql') AND engine = 'MyISAM' AND table_type = 'BASE TABLE' ORDER BY table_schema,table_name
dr fu manchu
61
SELECT CONCAT('ALTER TABLE ',TABLE_NAME,' ENGINE=InnoDB;')FROM INFORMATION_SCHEMA.TABLES
WHERE ENGINE='MyISAM'AND table_schema ='mydatabase';
Bekerja seperti pesona.
Ini akan memberi Anda daftar semua tabel dengan kueri alter yang bisa Anda jalankan dalam batch
Setelah menjalankan ini, Anda harus terlebih dahulu menjalankan query berikut: USE databasename; Kemudian Anda bisa menggunakan kueri yang diberikan skrip di atas.
gijs007
Bagaimana Anda menjalankan batch?
Marc Alexander
Kueri di atas akan memberi Anda mengubah kueri tabel. cukup pilih semuanya dan jalankan bersama. atau membaginya dalam kelompok 50 pertanyaan dan menjalankannya jika ada terlalu banyak tabel di resultset
Omkar Kulkarni
2
Ini bekerja bahkan pada 2018 dan pada Cluster Percona. Jika menggunakannya dari PHPMyAdmin, Anda hanya akan mendapatkan 20 atau lebih nama, lalu "..." atau simbol pagination >>. Ini berarti Anda harus mengklik dan terus menyalin semua halaman berikutnya sehingga Anda tidak akan kehilangan meja apa pun. Jika Anda lupa itu, Anda dapat dengan aman menerapkan kembali permintaan di atas dan itu akan memberi Anda tabel MyISAM berikutnya untuk dikonversi.
Dario Fumagalli
23
Dalam skrip di bawah ini, ganti <username>, <password> dan <schema> dengan data spesifik Anda.
Untuk menampilkan pernyataan yang bisa Anda salin-tempel ke sesi klien mysql, ketikkan yang berikut ini:
Tampaknya ini tidak benar-benar mengubah tabel ke InnoDB.
Charlie Schliesser
3
Ini menghasilkan skrip yang kemudian Anda jalankan untuk mengonversi tabel - ini adalah dua langkah. Itu mencoba untuk mengonversi tabel INFORMATION_SCHEMA, meskipun - itu hal yang buruk. Perlu membatasi ke database yang tepat.
Brilliand
1
Anda harus memfilter tabel mysql internal kami - menurut dokumen "Jangan mengonversi tabel sistem MySQL di database mysql (seperti pengguna atau host) ke tipe InnoDB. Ini adalah operasi yang tidak didukung. Tabel sistem harus selalu dari jenis MyISAM. " tautan
eug
Tanpa mengedit untuk memasukkan komentar @ eug ke dalam jawaban ini, saya pikir itu layak untuk down-vote, meskipun itu seanggun varian apa pun di halaman ini.
mc0e
Hmm. @ charlie-s juga benar, dan ini tidak menghasilkan SQL yang berfungsi. Pemungutan suara rendah menurut saya bisa dibenarkan.
mc0e
18
Anda dapat menjalankan pernyataan ini di alat baris perintah mysql:
echo "SELECT concat('ALTER TABLE `',TABLE_NAME,'` ENGINE=InnoDB;')
FROM Information_schema.TABLES
WHERE ENGINE != 'InnoDB' AND TABLE_TYPE='BASE TABLE'
AND TABLE_SCHEMA='name-of-database'"| mysql >convert.sql
Anda mungkin perlu menentukan nama pengguna dan kata sandi menggunakan: mysql -u nama pengguna -p Hasilnya adalah skrip sql yang dapat Anda pipa kembali ke mysql:
mysql name-of-database <convert.sql
Ganti "nama-database" di pernyataan dan baris perintah di atas.
Belum disebutkan, jadi saya akan menulisnya untuk anak cucu:
Jika Anda bermigrasi di antara server DB (atau memiliki alasan lain mengapa Anda akan membuang dan memuat ulang dta Anda), Anda dapat memodifikasi output dari mysqldump:
mysql DBNAME < my_schema.sql && mysql DBNAME < my_data.sql
(Juga, dalam pengalaman saya yang terbatas, ini bisa menjadi proses yang jauh lebih cepat daripada mengubah tabel 'hidup'. Mungkin tergantung pada jenis data dan indeks.)
ty! persis apa yang saya cari. Akan mengujinya dalam beberapa hari.
Rainer
7
Ini cara untuk melakukannya untuk pengguna Django:
from django.core.management.base import BaseCommand
from django.db import connections
class Command(BaseCommand):
def handle(self,database="default",*args,**options):cursor= connections[database].cursor()cursor.execute("SHOW TABLE STATUS");forrowincursor.fetchall():ifrow[1]!="InnoDB":print"Converting %s"%row[0],
result =cursor.execute("ALTER TABLE %s ENGINE=INNODB"%row[0])print result
Tambahkan itu ke aplikasi Anda di bawah folder manajemen / perintah / Kemudian Anda dapat mengonversi semua tabel Anda dengan perintah manage.py:
Dari dalam mysql, Anda dapat menggunakan pencarian / ganti menggunakan editor teks:
SELECT table_schema, table_name FROM INFORMATION_SCHEMA.TABLES WHERE engine ='myisam';
Catatan: Anda mungkin harus mengabaikan information_schema dan mysql karena "Database mysql dan information_schema, yang mengimplementasikan beberapa internal MySQL, masih menggunakan MyISAM. Secara khusus, Anda tidak dapat mengganti tabel hibah untuk menggunakan InnoDB." ( http://dev.mysql.com/doc/refman/5.5/id/innodb-default-se.html )
Bagaimanapun, perhatikan tabel untuk diabaikan dan dijalankan:
SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE engine ='myisam';
Sekarang cukup salin / tempel daftar itu ke editor teks Anda dan cari / ganti "|" dengan "ALTER TABLE" dll.
Anda kemudian akan memiliki daftar seperti ini, Anda cukup menempelkan ke terminal mysql Anda:
Jika editor teks Anda tidak dapat melakukan ini dengan mudah, inilah solusi lain untuk mendapatkan daftar yang serupa (yang dapat Anda tempel ke mysql) hanya untuk satu awalan dari basis data Anda, dari terminal linux:
mysql -u [username]-p[password]-B -N -e 'show tables like "arth_%"'[database name]| xargs -I '{}' echo "ALTER TABLE {} ENGINE=INNODB;"
Anda cukup memulai mysql yang dapat dieksekusi, menggunakan basis data dan menyalin-tempel kueri.
Ini akan mengkonversi semua tabel MyISAM di Database saat ini menjadi tabel INNODB.
DROP PROCEDURE IF EXISTS convertToInnodb;
DELIMITER //
CREATE PROCEDURE convertToInnodb()BEGIN
mainloop: LOOP
SELECT TABLE_NAME INTO @convertTable FROM information_schema.TABLES
WHERE `TABLE_SCHEMA` LIKE DATABASE()
AND `ENGINE` LIKE 'MyISAM' ORDER BY TABLE_NAME LIMIT 1;
IF @convertTable IS NULL THEN
LEAVE mainloop;END IF;
SET @sqltext:= CONCAT('ALTER TABLE `', DATABASE(),'`.`',@convertTable,'` ENGINE = INNODB');
PREPARE convertTables FROM @sqltext;
EXECUTE convertTables;
DEALLOCATE PREPARE convertTables;
SET @convertTable= NULL;END LOOP mainloop;END//
DELIMITER ;
CALL convertToInnodb();
DROP PROCEDURE IF EXISTS convertToInnodb;
Saya seorang pemula dan harus menemukan solusi saya sendiri karena perintah mysql di web biasanya penuh dengan salah eja menciptakan mimpi buruk kehidupan nyata bagi orang-orang yang baru memulai. Inilah solusi saya ....
Alih-alih dalam 1 perintah per tabel, saya menyiapkan puluhan perintah (siap untuk menyalin dan menempel) sekaligus menggunakan excel.
Bagaimana? perluas jendela dempul Anda dan masukkan mysql lalu jalankan perintah "SHOW TABLE STATUS;" dan salin / tempel output ke microsoft excel. Buka tab Data dan gunakan fitur "teks ke kolom" yang membatasi kolom dengan tombol spasi. Kemudian Sortir kolom berdasarkan kolom mana saja yang menunjukkan jenis tabel Anda dan hapus semua baris yang tabelnya sudah dalam format InnoDb (karena kita tidak perlu menjalankan perintah terhadap mereka, mereka sudah selesai). Kemudian tambahkan 2 kolom di sebelah kiri kolom tabel, dan 2 kolom di sebelah kanan. Kemudian tempel di bagian pertama dari perintah di kolom-1 (lihat di bawah). Kolom 2 seharusnya hanya berisi spasi. Kolom 3 adalah kolom tabel Anda. Kolom 4 seharusnya hanya berisi spasi. Kolom 5 adalah bagian terakhir dari perintah Anda. Seharusnya terlihat seperti ini:
Kemudian salin dan tempel sekitar 5 baris sekaligus ke mysql. Ini akan mengkonversi sekitar 5 sekaligus. Saya perhatikan jika saya melakukan lebih dari itu sekaligus maka perintah akan gagal.
<?php
$host ="host";$user="user";$pass ="pss";$database="db_name";$connect= new mysqli($host,$user,$pass,$database);// Actual code starts here Dont forget to change db_name !!$sql ="SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'db_name'
AND ENGINE = 'MyISAM'";$rs =$connect->query($sql);while($row=$rs->fetch_array()){$tbl =$row[0];$sql ="ALTER TABLE `$tbl` ENGINE=INNODB";$connect->query($sql);}?>
Namun pilihan lain ... Inilah cara melakukannya dengan cara yang mungkin. Diasumsikan bahwa nama database Anda dbnamedan bahwa Anda telah mengkonfigurasi akses.
- name: Get list of DB tables that need converting to InnoDB
command:>
mysql --batch --skip-column-names --execute="SELECT TABLE_NAMEFROM information_schema.TABLES
WHERE TABLE_SCHEMA ='{{ dbname }}'AND ENGINE ='MyISAM';"
register: converttables
check_mode: no
changed_when: False
- name: Convert any unconverted tables
command: >
mysql --batch --skip-column-names --execute="ALTERTABLE`{{ dbname }}`.`{{ item }}` ENGINE = InnoDB;"
with_items: "{{ converttables.stdout_lines }}"
Jawaban:
sumber
mysql_*
Antarmuka PHP sudah usang dan dihapus dari ver 7. Jangan gunakan kode ini apa adanya.Jalankan pernyataan SQL ini (di klien MySQL, phpMyAdmin, atau di mana pun) untuk mengambil semua tabel MyISAM di database Anda.
Ganti nilai
name_of_your_db
variabel dengan nama basis data Anda.Kemudian, salin output dan jalankan sebagai kueri SQL baru.
sumber
ORDER BY table_name DESC
)CONCAT('ALTER TABLE ', table_name, ' ENGINE=InnoDB;')
keCONCAT('ALTER TABLE ',@DATABASE_NAME,'.', table_name, ' ENGINE=InnoDB;')
SELECT CONCAT('ALTER TABLE `', table_schema, '`.`', table_name, '` ENGINE=InnoDB;') AS sql_statements FROM information_schema.tables WHERE table_schema NOT IN ('information_schema', 'performance_schema', 'mysql') AND engine = 'MyISAM' AND table_type = 'BASE TABLE' ORDER BY table_schema,table_name
Bekerja seperti pesona.
Ini akan memberi Anda daftar semua tabel dengan kueri alter yang bisa Anda jalankan dalam batch
sumber
Dalam skrip di bawah ini, ganti <username>, <password> dan <schema> dengan data spesifik Anda.
Untuk menampilkan pernyataan yang bisa Anda salin-tempel ke sesi klien mysql, ketikkan yang berikut ini:
Untuk hanya menjalankan perubahan, gunakan ini:
KREDIT: Ini adalah variasi dari apa yang diuraikan dalam artikel ini .
sumber
Satu baris:
sumber
"$1"
backticks seperti ini:`"$1"`
mirip dengan apa yang ada di jawaban saya.Gunakan ini sebagai kueri sql di phpMyAdmin Anda
sumber
Anda dapat menjalankan pernyataan ini di alat baris perintah mysql:
Anda mungkin perlu menentukan nama pengguna dan kata sandi menggunakan: mysql -u nama pengguna -p Hasilnya adalah skrip sql yang dapat Anda pipa kembali ke mysql:
Ganti "nama-database" di pernyataan dan baris perintah di atas.
sumber
-bash: ,TABLE_NAME,: command not found
Sangat sederhana hanya ada DUA langkah saja salin dan tempel:
Langkah 1.
(salin dan tempel semua hasil di tab sql)
langkah 2: (salin semua hasil dalam tab sql) dan rekatkan di bawah ini di baris
MULAI TRANSAKSI;
MELAKUKAN;
misalnya. MULAI TRANSAKSI;
ALTER TABLE
admin_files
ENGINE = InnoDB;MELAKUKAN;
sumber
Untuk menghasilkan pernyataan ALTER untuk semua tabel di semua skema non-sistem, dipesan oleh skema / tabel tersebut jalankan sebagai berikut:
Setelah itu, jalankan kueri tersebut melalui klien untuk melakukan perubahan.
sumber
Belum disebutkan, jadi saya akan menulisnya untuk anak cucu:
Jika Anda bermigrasi di antara server DB (atau memiliki alasan lain mengapa Anda akan membuang dan memuat ulang dta Anda), Anda dapat memodifikasi output dari
mysqldump
:Kemudian muat lagi:
(Juga, dalam pengalaman saya yang terbatas, ini bisa menjadi proses yang jauh lebih cepat daripada mengubah tabel 'hidup'. Mungkin tergantung pada jenis data dan indeks.)
sumber
Ini cara untuk melakukannya untuk pengguna Django:
Tambahkan itu ke aplikasi Anda di bawah folder manajemen / perintah / Kemudian Anda dapat mengonversi semua tabel Anda dengan perintah manage.py:
sumber
Dari dalam mysql, Anda dapat menggunakan pencarian / ganti menggunakan editor teks:
Catatan: Anda mungkin harus mengabaikan information_schema dan mysql karena "Database mysql dan information_schema, yang mengimplementasikan beberapa internal MySQL, masih menggunakan MyISAM. Secara khusus, Anda tidak dapat mengganti tabel hibah untuk menggunakan InnoDB." ( http://dev.mysql.com/doc/refman/5.5/id/innodb-default-se.html )
Bagaimanapun, perhatikan tabel untuk diabaikan dan dijalankan:
Sekarang cukup salin / tempel daftar itu ke editor teks Anda dan cari / ganti "|" dengan "ALTER TABLE" dll.
Anda kemudian akan memiliki daftar seperti ini, Anda cukup menempelkan ke terminal mysql Anda:
Jika editor teks Anda tidak dapat melakukan ini dengan mudah, inilah solusi lain untuk mendapatkan daftar yang serupa (yang dapat Anda tempel ke mysql) hanya untuk satu awalan dari basis data Anda, dari terminal linux:
sumber
Versi MySQL biasa.
Anda cukup memulai mysql yang dapat dieksekusi, menggunakan basis data dan menyalin-tempel kueri.
Ini akan mengkonversi semua tabel MyISAM di Database saat ini menjadi tabel INNODB.
sumber
gunakan baris ini untuk mengubah mesin database untuk satu tabel.
sumber
Saya seorang pemula dan harus menemukan solusi saya sendiri karena perintah mysql di web biasanya penuh dengan salah eja menciptakan mimpi buruk kehidupan nyata bagi orang-orang yang baru memulai. Inilah solusi saya ....
Alih-alih dalam 1 perintah per tabel, saya menyiapkan puluhan perintah (siap untuk menyalin dan menempel) sekaligus menggunakan excel.
Bagaimana? perluas jendela dempul Anda dan masukkan mysql lalu jalankan perintah "SHOW TABLE STATUS;" dan salin / tempel output ke microsoft excel. Buka tab Data dan gunakan fitur "teks ke kolom" yang membatasi kolom dengan tombol spasi. Kemudian Sortir kolom berdasarkan kolom mana saja yang menunjukkan jenis tabel Anda dan hapus semua baris yang tabelnya sudah dalam format InnoDb (karena kita tidak perlu menjalankan perintah terhadap mereka, mereka sudah selesai). Kemudian tambahkan 2 kolom di sebelah kiri kolom tabel, dan 2 kolom di sebelah kanan. Kemudian tempel di bagian pertama dari perintah di kolom-1 (lihat di bawah). Kolom 2 seharusnya hanya berisi spasi. Kolom 3 adalah kolom tabel Anda. Kolom 4 seharusnya hanya berisi spasi. Kolom 5 adalah bagian terakhir dari perintah Anda. Seharusnya terlihat seperti ini:
Kemudian salin dan tempel sekitar 5 baris sekaligus ke mysql. Ini akan mengkonversi sekitar 5 sekaligus. Saya perhatikan jika saya melakukan lebih dari itu sekaligus maka perintah akan gagal.
sumber
Dalam kasus saya, saya bermigrasi dari instance MySQL dengan default MyISAM, ke instance MariaDB dengan DEFAULT InnoDB.
Per MariaDB Migration Doc's.
Di Server Run yang lama:
--Skip-create-options memastikan bahwa server database menggunakan mesin penyimpanan default saat memuat data, bukan MyISAM.
Ini menimbulkan kesalahan dalam membuat mysql.db, tetapi semuanya bekerja dengan baik sekarang :)
sumber
Hanya menguji cara lain (sederhana?), Dan berhasil untuk saya.
Cukup ekspor DB Anda sebagai file .sql, edit-itu dengan gedit atau notepad;
Ganti
ENGINE=MyISAM
denganENGINE=INNODB
dan Simpan file yang sudah dieditJumlah atau penggantian yang dilakukan harus menjadi jumlah tabel Anda
Impor ke MySQL (phpMyAdmin atau command line)
Dan Voila!
sumber
Anda dapat menulis skrip untuk melakukannya dalam bahasa skrip favorit Anda. Script akan melakukan hal berikut:
SHOW FULL TABLES
.'BASE TABLE'
dan tidak'VIEW'
.'VIEW'
, keluarkanALTER TABLE
perintah yang sesuai .sumber
Coba skrip shell ini
sumber
Beberapa perbaikan pada skrip util ini
sumber
sumber
Ini adalah skrip php sederhana.
sumber
sumber
untuk koneksi mysqli;
sumber
Namun pilihan lain ... Inilah cara melakukannya dengan cara yang mungkin. Diasumsikan bahwa nama database Anda
dbname
dan bahwa Anda telah mengkonfigurasi akses.sumber
cd / var / lib / mysql / DBNAME
ls | grep ".frm" | cut -d "." -f1 | xargs -I {} -n1 mysql -D DBNAME -e "ubah tabel {} ENGINE = INNODB;" -jalankan -pXXXXX
sumber