Câu trả lời:
<?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_*
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.
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_db
biế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.
ORDER BY table_name DESC
)
CONCAT('ALTER TABLE ', table_name, ' ENGINE=InnoDB;')
thànhCONCAT('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';
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
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 .
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"
backticks như thế này: `"$1"`
tương tự như câu trả lời của tôi.
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';
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.
-bash: ,TABLE_NAME,: command not found
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;
Để 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.
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.)
Đâ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
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;"
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;
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;
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.
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.
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ờ :)
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=MyISAM
bằng ENGINE=INNODB
và 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 !
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
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;
<?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");
}
}
Đâ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>';
}
<?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();
?>
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);
} ?>
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 dbname
và 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 }}"