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
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
Câu trả lời:
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
Bạn có thể sử dụng MySQL để kịch bản nó và thực thi nó:
dbname
sang MyISAMCONVERT_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}
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.
dbname
sang MyISAM và không sao chép sang các máy chủ khácCONVERT_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}
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 !!!
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/...
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/...
Đố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 username
và db_name
giá 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 phpmyadmin
hoặc của bạn mysql
.
Chúc mừng!
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