Bagaimana cara mengubah semua tabel dari MyISAM ke InnoDB?

264

Saya tahu saya bisa mengeluarkan tabel alter secara individual untuk mengubah penyimpanan tabel dari MyISAM ke InnoDB.

Saya bertanya-tanya apakah ada cara untuk dengan cepat mengubah semuanya menjadi InnoDB?

Pentium10
sumber
1
Kiat tentang konversi.
Rick James

Jawaban:

173
<?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);
    }
?>
Gajendra Bang
sumber
5
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'
ORDER BY table_name DESC;

Kemudian, salin output dan jalankan sebagai kueri SQL baru.

Will Jones
sumber
4
Itu bekerja dengan baik! Saya telah memasukkannya ke dalam contoh skrip shell di sini: shrubbery.mynetgear.net/c/display/W/…
Joshua Davis
4
"# 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

Omkar Kulkarni
sumber
5
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:

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 .

Vijay Varadan
sumber
23

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
kuzea
sumber
1
Jawaban TERBAIK dan INTELIJEN!
biniam
Ketika saya menjalankan ini dalam skrip bash, ia menginterpretasikan $ 1 sebagai variabel skrip bash yang menimpa definisi NR. Ada jalan lain?
Bekerja untuk Hidup
@WorksforaLiving melampirkan "$1"backticks seperti ini: `"$1"`mirip dengan apa yang ada di jawaban saya.
Vijay Varadan
20

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';
Zwarmapapa
sumber
3
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.

Hendrik Brummermann
sumber
@itsraja, "echo" adalah perintah yang didukung oleh sh di linux / unix dan cmd pada sistem Microsoft, hasilnya disalurkan sebagai input ke alat mysql.
Hendrik Brummermann
2
betul sekali. Tetapi Anda telah disebutkan sebagai "alat baris perintah mysql"
itsraja
1
Juga, gema "SELECT concat (concat ('ALTER TRABLE', TABLE_NAME), 'ENGINE = InnoDB;') DARI TABLES WHERE ENGINE! = 'InnoDB' DAN TABLE_TYPE = 'BASE TABLE' DAN TABLE_SCHEMA = 'testinno'" | mysql -u root --sock = / opt / lampp / var / mysql / mysql.sock --database = testinno> convert.sql KESALAHAN 1146 (42S02) pada baris 1: Tabel 'testinno.TABLES' tidak ada
itsraja
Saya telah memasukkan ini ke dalam contoh skrip shell di sini: shrubbery.mynetgear.net/c/display/W/…
Joshua Davis
1
Bagaimana kita bisa lolos dari pernyataan sql sebagai string? Seperti sekarang, saya mendapatkan-bash: ,TABLE_NAME,: command not found
arjan
10

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_filesENGINE = InnoDB;

MELAKUKAN;

Sachin dari Pune
sumber
10

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.

  • Jawaban didasarkan pada jawaban di atas, tetapi meningkatkan penanganan skema.
Lavi Avigdor
sumber
8

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

Rekomendasi Quinn
sumber
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");

        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
lintah
sumber
5

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;"
PJ Brunet
sumber
5

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;
Harald Leithner
sumber
Saya terkejut bahwa tidak ada lagi solusi berbasis prosedur yang tersimpan!
FrustratedWithFormsDesigner
Karena menulis dan menguji prosedur di MySQL adalah menyakitkan ;-) komentar tidak ada hubungannya dengan pertanyaan.
Harald Leithner
3

gunakan baris ini untuk mengubah mesin database untuk satu tabel.

  ALTER TABLE table_name ENGINE = INNODB;
Pengembang
sumber
3

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.

pengguna3035649
sumber
3

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:

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

FreeSoftwareServers
sumber
3

Hanya menguji cara lain (sederhana?), Dan berhasil untuk saya.

Cukup ekspor DB Anda sebagai file .sql, edit-itu dengan gedit atau notepad;

Ganti ENGINE=MyISAMdengan ENGINE=INNODBdan Simpan file yang sudah diedit

Jumlah atau penggantian yang dilakukan harus menjadi jumlah tabel Anda

Impor ke MySQL (phpMyAdmin atau command line)

Dan Voila!

Malibou
sumber
2

Anda dapat menulis skrip untuk melakukannya dalam bahasa skrip favorit Anda. Script akan melakukan hal berikut:

  1. Masalah SHOW FULL TABLES.
  2. Untuk setiap baris yang dikembalikan, periksa apakah kolom kedua mengatakan 'BASE TABLE'dan tidak 'VIEW'.
  3. Jika tidak 'VIEW', keluarkan ALTER TABLEperintah yang sesuai .
Hammerite
sumber
2

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
Muhammad Reda
sumber
2

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;
pengguna3035727
sumber
1
<?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");
    }
  }
Rodrigo Gregorio
sumber
1

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>';
    }
touzas
sumber
1
<?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();

?>
Russell G
sumber
1

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);
} ?>
Berdan
sumber
0

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_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 }}"
Sinkron
sumber
-1

cd / var / lib / mysql / DBNAME

ls | grep ".frm" | cut -d "." -f1 | xargs -I {} -n1 mysql -D DBNAME -e "ubah tabel {} ENGINE = INNODB;" -jalankan -pXXXXX

api984
sumber