Jawaban:
<?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);
}
?>
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.
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'
ORDER BY table_name DESC;
Kemudian, salin output dan jalankan sebagai kueri SQL baru.
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
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
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:
echo 'SHOW TABLES;' \
| mysql -u <username> --password=<password> -D <schema> \
| awk '!/^Tables_in_/ {print "ALTER TABLE `"$0"` ENGINE = InnoDB;"}' \
| column -t \
Untuk hanya menjalankan perubahan, gunakan ini:
echo 'SHOW TABLES;' \
| mysql -u <username> --password=<password> -D <schema> \
| awk '!/^Tables_in_/ {print "ALTER TABLE `"$0"` ENGINE = InnoDB;"}' \
| column -t \
| mysql -u <username> --password=<password> -D <schema>
KREDIT: Ini adalah variasi dari apa yang diuraikan dalam artikel ini .
Satu baris:
mysql -u root -p dbName -e
"show table status where Engine='MyISAM';" | awk
'NR>1 {print "ALTER TABLE "$1" ENGINE = InnoDB;"}' |
mysql -u root -p dbName
"$1"
backticks seperti ini: `"$1"`
mirip dengan apa yang ada di jawaban saya.
Gunakan ini sebagai kueri sql di phpMyAdmin Anda
SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' engine=InnoDB;')
FROM information_schema.tables
WHERE engine = 'MyISAM';
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.
-bash: ,TABLE_NAME,: command not found
Sangat sederhana hanya ada DUA langkah saja salin dan tempel:
Langkah 1.
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' ORDER BY table_name DESC;
(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;
Untuk menghasilkan pernyataan ALTER untuk semua tabel di semua skema non-sistem, dipesan oleh skema / tabel tersebut jalankan sebagai berikut:
SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.', table_name, ' ENGINE=InnoDB;') AS sql_statements
FROM information_schema.tables
WHERE TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema', 'innodb', 'sys', 'tmp')
AND `ENGINE` = 'MyISAM'
AND `TABLE_TYPE` = 'BASE TABLE'
ORDER BY TABLE_SCHEMA, table_name DESC;
Setelah itu, jalankan kueri tersebut melalui klien untuk melakukan perubahan.
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
:
mysqldump --no-data DBNAME | sed 's/ENGINE=MyISAM/ENGINE=InnoDB/' > my_schema.sql;
mysqldump --no-create-info DBNAME > my_data.sql;
Kemudian muat lagi:
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.)
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");
for row in cursor.fetchall():
if row[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:
python manage.py convert_to_innodb
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:
ALTER TABLE arth_commentmeta ENGINE=Innodb;
ALTER TABLE arth_comments ENGINE=Innodb;
ALTER TABLE arth_links ENGINE=Innodb;
ALTER TABLE arth_options ENGINE=Innodb;
ALTER TABLE arth_postmeta ENGINE=Innodb;
ALTER TABLE arth_posts ENGINE=Innodb;
ALTER TABLE arth_term_relationships ENGINE=Innodb;
ALTER TABLE arth_term_taxonomy ENGINE=Innodb;
ALTER TABLE arth_terms ENGINE=Innodb;
ALTER TABLE arth_usermeta ENGINE=Innodb;
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;"
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.
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;
gunakan baris ini untuk mengubah mesin database untuk satu tabel.
ALTER TABLE table_name ENGINE = INNODB;
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:
column-1 column-2 column-3 column-4 column-5
ALTER TABLE t_lade_tr ENGINE=InnoDB;
ALTER TABLE t_foro_detail_ms ENGINE=InnoDB;
ALTER TABLE t_ljk_ms ENGINE=InnoDB;
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.
Dalam kasus saya, saya bermigrasi dari instance MySQL dengan default MyISAM, ke instance MariaDB dengan DEFAULT InnoDB.
Di Server Run yang lama:
mysqldump -u root -p --skip-create-options --all-databases > migration.sql
--Skip-create-options memastikan bahwa server database menggunakan mesin penyimpanan default saat memuat data, bukan MyISAM.
mysql -u root -p < migration.sql
Ini menimbulkan kesalahan dalam membuat mysql.db, tetapi semuanya bekerja dengan baik sekarang :)
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
dengan ENGINE=INNODB
dan Simpan file yang sudah diedit
Jumlah atau penggantian yang dilakukan harus menjadi jumlah tabel Anda
Impor ke MySQL (phpMyAdmin atau command line)
Dan Voila!
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'
, keluarkan ALTER TABLE
perintah yang sesuai .Coba skrip shell ini
DBENGINE='InnoDB' ;
DBUSER='your_db_user' ;
DBNAME='your_db_name' ;
DBHOST='your_db_host'
DBPASS='your_db_pass' ;
mysqldump --add-drop-table -h$DBHOST -u$DBUSER -p$DBPASS $DBNAME > mtest.sql; mysql -h$DBHOST -u$DBUSER -p$DBPASS $DBNAME -Nse "SHOW TABLES;" | while read TABLE ; do mysql -h$DBHOST -u$DBUSER -p$DBPASS $DBNAME -Nse "ALTER TABLE $TABLE ENGINE=$DBENGINE;" ; done
Beberapa perbaikan pada skrip util ini
SET @DATABASE_NAME = 'Integradb';
SELECT CONCAT('ALTER TABLE ', table_schema, '.', 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'
ORDER BY table_name DESC;
<?php
// connect your database here first
mysql_connect('host', 'user', 'pass');
$databases = mysql_query('SHOW databases');
while($db = mysql_fetch_array($databases)) {
echo "database => {$db[0]}\n";
mysql_select_db($db[0]);
$tables = mysql_query('SHOW tables');
while($tbl = mysql_fetch_array($tables)) {
echo "table => {$tbl[0]}\n";
mysql_query("ALTER TABLE {$tbl[0]} ENGINE=MyISAM");
}
}
Ini adalah skrip php sederhana.
<?php
@error_reporting(E_ALL | E_STRICT);
@ini_set('display_errors', '1');
$con = mysql_connect('server', 'user', 'pass');
$dbName = 'moodle2014';
$sql = "SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '".$dbName."';";
$rs = mysql_query($sql, $con);
$count = 0;
$ok = 0;
while($row = mysql_fetch_array($rs)){
$count ++;
$tbl = $row[0];
$sql = "ALTER TABLE ".$dbName.".".$tbl." ENGINE=INNODB;";
$resultado = mysql_query($sql);
if ($resultado){
$ok ++;
echo $sql."<hr/>";
}
}
if ($count == $ok){
echo '<div style="color: green"><b>ALL OK</b></div>';
}else{
echo '<div style="color: red"><b>ERRORS</b>Total tables: '.$count.', updated tables:'.$ok.'</div>';
}
<?php
// Convert all MyISAM tables to INNODB tables in all non-special databases.
// Note: With MySQL less than 5.6, tables with a fulltext search index cannot be converted to INNODB and will be skipped.
if($argc < 4)
exit("Usage: {$argv[0]} <host> <username> <password>\n");
$host = $argv[1];
$username = $argv[2];
$password = $argv[3];
// Connect to the database.
if(!mysql_connect($host, $username, $password))
exit("Error opening database. " . mysql_error() . "\n");
// Get all databases except special ones that shouldn't be converted.
$databases = mysql_query("SHOW databases WHERE `Database` NOT IN ('mysql', 'information_schema', 'performance_schema')");
if($databases === false)
exit("Error showing databases. " . mysql_error() . "\n");
while($db = mysql_fetch_array($databases))
{
// Select the database.
if(!mysql_select_db($db[0]))
exit("Error selecting database: {$db[0]}. " . mysql_error() . "\n");
printf("Database: %s\n", $db[0]);
// Get all MyISAM tables in the database.
$tables = mysql_query("SHOW table status WHERE Engine = 'MyISAM'");
if($tables === false)
exit("Error showing tables. " . mysql_error() . "\n");
while($tbl = mysql_fetch_array($tables))
{
// Convert the table to INNODB.
printf("--- Converting %s\n", $tbl[0]);
if(mysql_query("ALTER TABLE `{$tbl[0]}` ENGINE = INNODB") === false)
printf("--- --- Error altering table: {$tbl[0]}. " . mysql_error() . "\n");
}
}
mysql_close();
?>
untuk koneksi mysqli;
<?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 dbname
dan 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_NAME
FROM 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="ALTER TABLE `{{ dbname }}`.`{{ item }}` ENGINE = InnoDB;"
with_items: "{{ converttables.stdout_lines }}"