Làm cách nào để chuyển đổi tất cả các bảng từ MyISAM sang InnoDB?


264

Tôi biết tôi có thể phát hành một bảng thay đổi riêng lẻ để thay đổi bộ lưu trữ bảng từ MyISAM sang InnoDB.

Tôi tự hỏi liệu có cách nào để nhanh chóng thay đổi tất cả chúng thành InnoDB không?


1
Lời khuyên về việc chuyển đổi.
Rick James

Câu trả lời:


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

5
Có lẽ sẽ tốt hơn nếu giới hạn điều này với cơ sở dữ liệu bạn đang tập trung vào. Thêm "AND TABLE_SCHema = 'dbname', nếu không, điều này có thể / sẽ thay đổi tất cả các bảng MySQL trên internet thành innodb (khi một số trong số chúng phải là bộ nhớ)

7
mysql_*Giao diện của PHP không được dùng nữa và bị xóa khỏi ver 7. Đừng sử dụng mã này.
Rick James

4
@GajendraBang - Có, câu trả lời là hợp lệ khi được trình bày. Nhưng đối với người mới, nó không còn hiệu lực. Mục đích của tôi là để cảnh báo chống lại sử dụng nó như là .
Rick James

1
Câu hỏi không đề cập đến PHP gì
phil294

1
Làm thế nào là chỉnh sửa gần đây nhất không được gắn cờ? Phần MySQL là bản sao trực tiếp câu trả lời của Will Jones. Nhìn vào từng lịch sử chỉnh sửa để thấy rằng câu trả lời của Will xuất hiện vào năm 2013 trong khi câu trả lời này xuất hiện vào năm 2019. Kết quả là tính toàn vẹn của câu hỏi này bị xâm phạm.
rmutalik

549

Chạy câu lệnh SQL này (trong máy khách MySQL, phpMyAdmin hoặc bất cứ nơi nào) để lấy tất cả các bảng MyISAM trong cơ sở dữ liệu của bạn.

Thay thế giá trị của name_of_your_dbbiến bằng tên cơ sở dữ liệu của bạn.

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;

Sau đó, sao chép đầu ra và chạy như một truy vấn SQL mới.


4
Điều đó đã làm việc độc đáo! Tôi đã đặt nó vào một kịch bản shell mẫu ở đây: shrubbery.mynetgear.net/c/display/W/ mẹo
Joshua Davis

4
"# 1267 hỗn hợp bất hợp pháp ..." Tôi đang gặp lỗi này, nó không hoạt động
Rápli András

1
Vì tò mò, điểm của thứ tự giảm dần rõ ràng là gì? ( ORDER BY table_name DESC)
rinogo

12
Nếu bạn giao dịch với nhiều cơ sở dữ liệu và không muốn thay đổi cơ sở dữ liệu mọi lúc, hãy đổi CONCAT('ALTER TABLE ', table_name, ' ENGINE=InnoDB;')thànhCONCAT('ALTER TABLE ',@DATABASE_NAME,'.', table_name, ' ENGINE=InnoDB;')
ub3rst4r

1
Nếu bạn muốn nhận các báo cáo cho tất cả các cơ sở dữ liệu (ngoại trừ cơ sở dữ liệu hệ thống 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';

Hoạt động như một lá bùa.

Điều này sẽ cung cấp cho bạn danh sách tất cả các bảng với các truy vấn thay đổi mà bạn có thể chạy trong một đợt


5
Sau khi chạy, trước tiên bạn cần thực hiện truy vấn sau: USE databasename; Sau đó, bạn có thể sử dụng các truy vấn mà kịch bản trên đưa ra.
gijs007

Làm thế nào để bạn chạy một lô?
Marc Alexander

Các truy vấn trên sẽ cung cấp cho bạn thay đổi các truy vấn bảng. chỉ cần chọn tất cả chúng và thực hiện chúng cùng nhau. hoặc chia chúng thành các nhóm 50 truy vấn và chạy chúng nếu có quá nhiều bảng trong tập kết quả
Omkar Kulkarni

2
Nó hoạt động ngay cả vào năm 2018 và trên Percona Cluster. Nếu sử dụng nó từ PHPMyAdmin, bạn sẽ chỉ nhận được khoảng 20 tên, sau đó là "..." hoặc biểu tượng phân trang >>. Điều này có nghĩa là bạn phải nhấp và tiếp tục sao chép tất cả các trang tiếp theo để bạn không bỏ lỡ bất kỳ bảng nào. Nếu bạn quên điều đó, bạn có thể áp dụng lại truy vấn trên một cách an toàn và nó sẽ cung cấp cho bạn các bảng MyISAM tiếp theo để chuyển đổi.
Dario Fumagalli

23

Trong các tập lệnh bên dưới, thay thế <tên người dùng>, <mật khẩu> và <lược đồ> bằng dữ liệu cụ thể của bạn.

Để hiển thị các câu lệnh mà bạn có thể sao chép-dán vào phiên máy khách mysql, gõ như sau:

echo 'SHOW TABLES;' \
 | mysql -u <username> --password=<password> -D <schema> \
 | awk '!/^Tables_in_/ {print "ALTER TABLE `"$0"` ENGINE = InnoDB;"}' \
 | column -t \

Để thực hiện thay đổi, hãy sử dụng:

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>

CREDIT: Đây là một biến thể của những gì đã được nêu trong bài viết này .


23

Một đường thẳng:

 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
Câu trả lời TỐT NHẤT và HẤP DẪN nhất!
biniam

Khi tôi chạy mã này trong tập lệnh bash, nó diễn giải $ 1 dưới dạng biến tập lệnh bash ghi đè định nghĩa NR. Có cách nào khác không?
Hoạt động để kiếm sống

@WorksforaLiving kèm theo các "$1"backticks như thế này: `"$1"`tương tự như câu trả lời của tôi.
Vijay Varadan

20

Sử dụng điều này như một truy vấn sql trong phpMyAdmin của bạn

SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' engine=InnoDB;') 
FROM information_schema.tables 
WHERE engine = 'MyISAM';

3
Điều này dường như không thực sự chuyển đổi các bảng thành InnoDB.
Charlie Schliesser

3
Điều này xuất ra một tập lệnh mà sau đó bạn chạy để chuyển đổi các bảng - đó là hai bước. Mặc dù vậy, nó cố gắng chuyển đổi các bảng Information_SCHema - đó là một điều tồi tệ. Cần giới hạn nó vào cơ sở dữ liệu đúng.
Brilliand

1
Bạn sẽ phải lọc các bảng mysql nội bộ của chúng tôi - theo tài liệu "Không chuyển đổi các bảng hệ thống MySQL trong cơ sở dữ liệu mysql (như người dùng hoặc máy chủ) sang loại InnoDB. Đây là hoạt động không được hỗ trợ. Các bảng hệ thống phải luôn luôn được hỗ trợ. thuộc loại MyISAM. " liên kết
eug

Không chỉnh sửa để kết hợp nhận xét của @ eug vào câu trả lời này, tôi nghĩ rằng nó xứng đáng được bình chọn, mặc dù nó thanh lịch như bất kỳ biến thể nào trên trang này.
mc0e

Hừm. @ charlie-s cũng đúng và điều này không tạo ra SQL hoạt động. Một cuộc bỏ phiếu dường như là hợp lý.
mc0e

18

Bạn có thể thực thi câu lệnh này trong công cụ dòng lệnh 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

Bạn có thể cần chỉ định tên người dùng và mật khẩu bằng cách sử dụng: mysql -u tên người dùng -p Kết quả là một tập lệnh sql mà bạn có thể chuyển trở lại vào mysql:

mysql name-of-database < convert.sql

Thay thế "tên của cơ sở dữ liệu" trong câu lệnh và dòng lệnh trên.


@itsraja, "echo" là một lệnh được hỗ trợ bởi cả sh trên linux / unix và cmd trên các hệ thống của Microsoft, kết quả được chuyển thành đầu vào cho công cụ mysql.
Hendrik Brummermann

2
đúng rồi. Nhưng bạn đã đề cập đến như "công cụ dòng lệnh mysql"
itraja

1
Đồng thời, lặp lại "CHỌN concat (concat ('ALTER TRABLE', TABLE_NAME), 'Engine = InnoDB;') TỪ BẢNG WHERE Engine! = 'InnoDB' VÀ TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHema = 'testinno'" | gốc mysql -u --sock = / opt / lampp / var / mysql / mysql.sock --database = testinno> convert.sql ERROR 1146 (42S02) tại dòng 1: Bảng 'testinno.TABLES' không tồn tại
itraja

Tôi đã đưa tập lệnh này vào tập lệnh shell mẫu ở đây: shrubbery.mynetgear.net/c/display/W/ mẹo
Joshua Davis

1
Làm thế nào chúng ta có thể thoát đúng câu lệnh sql dưới dạng một chuỗi? Như bây giờ, tôi nhận được-bash: ,TABLE_NAME,: command not found
arjan

10

Rất đơn giản, chỉ có HAI bước chỉ cần sao chép và dán:

bước 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;

(sao chép và dán tất cả kết quả vào tab sql)

Bước 2: (sao chép tất cả kết quả vào tab sql) và dán bên dưới vào dòng

BẮT ĐẦU GIAO DỊCH;

CAM KẾT;

ví dụ. BẮT ĐẦU GIAO DỊCH;

BẢNG BẢNG admin_files ENGINE = InnoDB;

CAM KẾT;


10

Để tạo các câu lệnh ALTER cho tất cả các bảng trong tất cả các lược đồ phi hệ thống, được sắp xếp theo các lược đồ / bảng đó chạy như sau:

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;

Sau đó, chạy các truy vấn đó thông qua máy khách để thực hiện thay đổi.

  • Câu trả lời dựa trên các câu trả lời trên, nhưng cải thiện việc xử lý lược đồ.

8

Nó chưa được đề cập đến, vì vậy tôi sẽ viết nó cho hậu thế:

Nếu bạn đang di chuyển giữa các máy chủ DB (hoặc có lý do khác bạn sẽ đổ và tải lại dta của mình), bạn có thể sửa đổi đầu ra từ mysqldump:

mysqldump --no-data DBNAME | sed 's/ENGINE=MyISAM/ENGINE=InnoDB/' > my_schema.sql;
mysqldump --no-create-info DBNAME > my_data.sql;

Sau đó tải lại:

mysql DBNAME < my_schema.sql && mysql DBNAME < my_data.sql

(Ngoài ra, theo kinh nghiệm hạn chế của tôi, đây có thể là một quá trình nhanh hơn nhiều so với việc thay đổi các bảng 'sống'. Nó có thể phụ thuộc vào loại dữ liệu và chỉ mục.)


ty! Chính xác những gì tôi đang tìm kiếm. Sẽ kiểm tra nó trong một vài ngày.
Rainer

7

Đây là một cách để làm điều đó cho người dùng 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

Thêm vào ứng dụng của bạn trong phần quản lý thư mục / lệnh / Sau đó, bạn có thể chuyển đổi tất cả các bảng của mình bằng lệnh Manage.py:

python manage.py convert_to_innodb

5

Từ bên trong mysql, bạn có thể sử dụng tìm kiếm / thay thế bằng trình soạn thảo văn bản:

SELECT table_schema, table_name FROM INFORMATION_SCHEMA.TABLES WHERE engine = 'myisam';

Lưu ý: Có lẽ bạn nên bỏ qua information_schema và mysql vì "Cơ sở dữ liệu mysql và information_schema, thực hiện một số phần bên trong MySQL, vẫn sử dụng MyISAM. Đặc biệt, bạn không thể chuyển đổi các bảng cấp để sử dụng InnoDB." ( http://dev.mysql.com/doc/refman/5.5/en/innodb-default-se.html )

Trong mọi trường hợp, lưu ý các bảng để bỏ qua và chạy:

SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE engine = 'myisam';

Bây giờ chỉ cần sao chép / dán danh sách đó vào trình soạn thảo văn bản của bạn và tìm kiếm / thay thế "|" với "ALTER TABLE", v.v.

Sau đó, bạn sẽ có một danh sách như thế này, bạn chỉ cần dán vào thiết bị đầu cuối mysql của mình:

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;

Nếu trình soạn thảo văn bản của bạn không thể thực hiện điều này một cách dễ dàng, thì đây là một giải pháp khác để có được một danh sách tương tự (mà bạn có thể dán vào mysql) chỉ với một tiền tố của cơ sở dữ liệu của bạn, từ thiết bị đầu cuối linux:

mysql -u [username] -p[password] -B -N -e 'show tables like "arth_%"' [database name] | xargs -I '{}' echo "ALTER TABLE {} ENGINE=INNODB;"

5

Một phiên bản MySQL đơn giản.

Bạn chỉ có thể bắt đầu thực thi mysql, sử dụng cơ sở dữ liệu và sao chép-dán truy vấn.

Điều này sẽ chuyển đổi tất cả các bảng MyISAM trong Cơ sở dữ liệu hiện tại thành các bảng 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;

Tôi ngạc nhiên rằng không có nhiều giải pháp dựa trên thủ tục được lưu trữ!
Thất vọngWithFormsDesigner

Bởi vì các quy trình viết và kiểm tra trong MySQL là đau đớn ;-) bình luận không liên quan gì đến câu hỏi.
Harald Leithner

3

sử dụng dòng này để thay đổi công cụ cơ sở dữ liệu cho bảng đơn.

  ALTER TABLE table_name ENGINE = INNODB;

3

Tôi là một người mới và phải tìm giải pháp của riêng mình vì các lệnh mysql trên web thường bị đánh vần sai chính tả tạo ra cơn ác mộng trong đời thực cho những người mới bắt đầu. Đây là giải pháp của tôi ....

Thay vì trong 1 lệnh trên mỗi bảng, tôi đã chuẩn bị hàng tá lệnh (sẵn sàng sao chép và dán) cùng một lúc bằng excel.

Làm sao? mở rộng cửa sổ putty của bạn và nhập mysql và sau đó chạy lệnh "SHOW TABLE STATUS;" và sao chép / dán đầu ra vào microsoft excel. Chuyển đến tab Dữ liệu và sử dụng tính năng "chuyển văn bản thành cột" để phân định các cột bằng phím cách. Sau đó Sắp xếp các cột theo bất kỳ cột nào hiển thị các loại bảng của bạn và xóa tất cả các hàng mà các bảng đã có định dạng InnoDb (vì chúng tôi không cần phải chạy các lệnh chống lại chúng, chúng đã được thực hiện). Sau đó thêm 2 cột vào bên trái của cột bảng và 2 cột ở bên phải. Sau đó dán vào phần đầu tiên của lệnh trong cột-1 (xem bên dưới). Cột 2 chỉ nên chứa một khoảng trắng. Cột 3 là cột bảng của bạn. Cột 4 chỉ nên chứa một khoảng trắng. Cột 5 là phần cuối cùng của lệnh của bạn. Nó sẽ giống như thế này:

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;

Sau đó sao chép và dán khoảng 5 hàng cùng một lúc vào mysql. Điều này sẽ chuyển đổi khoảng 5 cùng một lúc. Tôi nhận thấy nếu tôi làm nhiều hơn thế thì các lệnh sẽ thất bại.


3

Trong trường hợp của tôi, tôi đã di chuyển từ một phiên bản MySQL với mặc định là MyISAM, sang một phiên bản MariaDB với DEFAULT của InnoDB.

Per MariaDB Migration Doc's.

Trên máy chủ cũ chạy:

mysqldump -u root -p --skip-create-options --all-databases > migration.sql

Các tùy chọn --skip-create-đảm bảo rằng máy chủ cơ sở dữ liệu sử dụng công cụ lưu trữ mặc định khi tải dữ liệu, thay vì MyISAM.

mysql -u root -p < migration.sql

Điều này đã gây ra một lỗi liên quan đến việc tạo mysql.db, nhưng mọi thứ đều hoạt động tốt bây giờ :)


3

Chỉ cần thử nghiệm một cách khác (đơn giản?), Và làm việc cho tôi.

Chỉ cần xuất DB của bạn dưới dạng tệp .sql, chỉnh sửa nó bằng gedit hoặc notepad;

Thay thế ENGINE=MyISAMbằng ENGINE=INNODBvà Lưu tập tin đã chỉnh sửa

Số lượng hoặc thay thế được thực hiện phải là số lượng bảng của bạn

Nhập nó vào MySQL (phpMyAdmin hoặc dòng lệnh)

Và Voila !


2

Bạn có thể viết một kịch bản để làm điều đó bằng ngôn ngữ kịch bản yêu thích của bạn. Kịch bản sẽ làm như sau:

  1. Vấn đề SHOW FULL TABLES.
  2. Đối với mỗi hàng được trả về, hãy kiểm tra xem cột thứ hai có nói 'BASE TABLE'hay không 'VIEW'.
  3. Nếu không 'VIEW', hãy đưa ra ALTER TABLElệnh thích hợp .

2

Hãy thử kịch bản shell này

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

Một số bản sửa lỗi cho tập lệnh này

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;

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");
    }
  }

1

Đây là một tập lệnh php đơn giản.

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

cho kết nối 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

Còn một lựa chọn khác ... Đây là cách thực hiện trong ansible. Nó giả định rằng tên của cơ sở dữ liệu của bạn nằm trong dbnamevà bạn đã cấu hình quyền truy cập.

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

-1

cd / var / lib / mysql / DBNAME

ls | grep ".frm" | cắt -d "." -f1 | xargs -I {} -n1 mysql -D DBNAME -e "thay đổi bảng {} Engine = INNODB;" -tốt -pXXXXX

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.