Cách đơn giản hơn để chuyển đổi tất cả các bảng từ InnoDB sang MyISAM


13

Trước đây, tôi sử dụng điều này:

USE dbname;
ALTER TABLE tablename ENGINE=MYISAM;

Tôi đang tìm cách đơn giản hơn để chuyển đổi tất cả các bảng trong cơ sở dữ liệu, thay vì viết từng tên bảng một


1
Đơn giản hơn thế nào? Điều đó có vẻ khá đơn giản với tôi.
Zoredache

5
Tìm hiểu để sử dụng kịch bản để thực hiện mục tiêu của bạn.
Tom O'Connor

Câu trả lời:


11

Tôi không biết bất kỳ cách nào để làm điều này trong chính mysql, nhưng một tập lệnh shell đơn giản sẽ thực hiện công việc:

TABLES=$(mysql -pXXXXXXX -uXXXXXXX --skip-column-names -B -D $DB -e 'show tables')
for T in $TABLES
do
    mysql -pXXXXX -uXXXXX -D $DB -e "ALTER TABLE $T ENGINE=MYISAM"
done

1
Làm thế nào để vô hiệu hóa kiểm tra khóa ngoại?
realtebo

7

Bạn có thể sử dụng MySQL để kịch bản nó và thực thi nó:

Điều này sẽ chuyển đổi mọi bảng InnoDB trong cơ sở dữ liệu dbnamesang MyISAM

CONVERT_SCRIPT=Convert_dbname_InnoDB_to_MyISAM.sql
mysql -u... -p... -AN -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=MyISAM;') FROM information_schema.tables WHERE table_schema='dbname' AND engine='InnoDB';" > ${CONVERT_SCRIPT}
mysql -u... -p... -A < ${CONVERT_SCRIPT}

Điều này sẽ chuyển đổi mọi bảng InnoDB sang MyISAM

CONVERT_SCRIPT=Convert_InnoDB_to_MyISAM.sql
mysql -u... -p... -AN -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=MyISAM;') FROM information_schema.tables WHERE engine ='InnoDB';" > ${CONVERT_SCRIPT}
mysql -u... -p... -A < ${CONVERT_SCRIPT}

Nếu bạn không muốn chuyển đổi các bảng được sao chép thành Slaves, chỉ cần đặt SET SQL_LOG_BIN=0;làm dòng đầu tiên. Bằng cách đó, bạn có thể kiểm tra chuyển đổi trong thiết lập Master / Slave bằng cách chỉ chuyển đổi Slave trước và sau đó là Master sau.

Điều này sẽ chuyển đổi mọi bảng InnoDB trong cơ sở dữ liệu dbnamesang MyISAM và không sao chép sang các máy chủ khác

CONVERT_SCRIPT=Convert_dbname_InnoDB_to_MyISAM.sql
echo "SET SQL_LOG_BIN=0;" > ${CONVERT_SCRIPT}
mysql -u... -p... -AN -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=MyISAM;') FROM information_schema.tables WHERE table_schema='dbname' AND engine='InnoDB';" >> ${CONVERT_SCRIPT}
mysql -u... -p... -A < ${CONVERT_SCRIPT}

Điều này sẽ chuyển đổi mọi bảng InnoDB sang MyISAM và không sao chép sang các máy chủ khác

CONVERT_SCRIPT=Convert_InnoDB_to_MyISAM.sql
echo "SET SQL_LOG_BIN=0;" > ${CONVERT_SCRIPT}
mysql -u... -p... -AN -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=MyISAM;') FROM information_schema.tables WHERE engine ='InnoDB';" >> ${CONVERT_SCRIPT}
mysql -u... -p... -A < ${CONVERT_SCRIPT}

Hãy thử một lần !!!


Đi từ MyIsam2InnoDB trong thế giới thực có thể bạn sẽ muốn SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; ở đâu đó để bỏ qua các no_zero_date từ mysql 5,7 - Nguồn stackoverflow.com/questions/9192027/...
Antony Gibbs

Đi từ MyIsam2InnoDB trong thế giới thực có thể bạn sẽ muốn SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; ở đâu đó để bỏ qua các no_zero_date từ mysql 5,7 - Nguồn stackoverflow.com/questions/9192027/...
Antony Gibbs

0

Đối với những người vẫn còn vấn đề này, bạn có thể làm theo cách này để làm điều đó, tôi tìm thấy câu trả lời này trong một trang web. Nó giúp tôi rất nhiều:

shell> mysql -u username -p -e "SELECT concat('ALTER TABLE ', TABLE_NAME,' ENGINE=MYISAM;') FROM Information_schema.TABLES WHERE TABLE_SCHEMA = 'db_name' AND ENGINE = 'InnoDB' AND TABLE_TYPE = 'BASE TABLE'" | tail -n+2 >> alter.sql

Cập nhật usernamedb_namegiá trị với các giá trị của riêng bạn.

Khi thực thi tập lệnh, nó sẽ lưu một tệp dưới tên: alter.sql Mở tệp và thực thi nội dung trên dòng lệnh phpmyadminhoặc của bạn mysql.

Chúc mừng!


-1

Tôi thích một lớp lót cho loại công cụ này. Đây là một phiên bản một lót của câu trả lời được chấp nhận nhất.

Điều này hoạt động nếu bạn có tên người dùng và mật khẩu MySQL của bạn được đặt ~/.my.cnf.

D=your_db; for t in $(mysql $D -B -e 'SHOW TABLES'); do mysql $D -e "ALTER TABLE $t ENGINE=MyISAM"; done
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.