pengembangan-web-mp-pd.com

Bagaimana cara mengubah semua tabel dari MyISAM ke InnoDB?

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?

228
Pentium10
<?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);
    }
?>
150
Gajendra Bang

Jalankan pernyataan SQL ini (di klien MySQL, phpMyAdmin, atau di mana pun) untuk mengambil semua tabel MyISAM di database Anda.

Ganti nilai variabel name_of_your_db 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.

501
Will Jones
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

50
Omkar Kulkarni

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 .

23
Vijay Varadan

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
21
user3484955

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';
19
Zwarmapapa

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 username -p Hasilnya adalah skrip sql yang dapat Anda pipa kembali ke mysql:

mysql name-of-database < convert.sql

Ganti "nama-basis-data" di pernyataan dan baris perintah di atas.

17

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

MULAI TRANSAKSI;

MELAKUKAN;

mis . MULAI TRANSAKSI;

ALTER TABLE admin_files ENGINE = InnoDB;

MELAKUKAN;

9
Sachin from Pune

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 'langsung'. Mungkin tergantung pada jenis data dan indeks.)

8
Quinn Comendant

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

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.
6
Lavi Avigdor

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

Versi MySQL biasa.

Anda cukup memulai mysql yang dapat dieksekusi, menggunakan basis data dan menyalin-tempel kueri.

Ini akan mengonversi 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;
4
Harald Leithner

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;
2
user3035727

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

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 diedit

Jumlah atau penggantian yang dilakukan harus menjadi jumlah tabel Anda

Impor ke MySQL (phpMyAdmin atau command line)

Dan Voila!

2
Malik BOUKALLEL

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 bahwa kolom kedua mengatakan 'BASE TABLE' dan bukan 'VIEW'.
  3. Jika bukan 'VIEW', berikan perintah ALTER TABLE yang sesuai.
2
Hammerite

Dalam kasus saya, saya melakukan migrasi dari instance MySQL dengan default MyISAM, ke instance MariaDB dengan DEFAULT InnoDB.

Per Migrasi Doc MariaDB.

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

2

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

2
user3035649
<?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");
    }
  }
1
Rodrigo Gregorio
<?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();

?>
1
Russell G

gunakan baris ini untuk mengubah mesin database untuk satu tabel.

  ALTER TABLE table_name ENGINE = INNODB;
1
Developer

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>';
    }
1
touzas

Namun pilihan lain ... Berikut ini cara melakukannya dengan mungkin. Diasumsikan bahwa nama database Anda ada dalam 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 }}"
0
Synchro

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