วิธีที่ง่ายกว่าในการแปลงตารางทั้งหมดจาก InnoDB เป็น MyISAM


13

ก่อนหน้านี้ฉันใช้สิ่งนี้:

USE dbname;
ALTER TABLE tablename ENGINE=MYISAM;

ฉันกำลังมองหาวิธีที่ง่ายกว่าในการแปลงตารางทั้งหมดในฐานข้อมูลแทนที่จะเขียนชื่อตารางทุกตัวทีละตัว


1
เรียบง่ายได้อย่างไร นั่นดูเรียบง่ายสำหรับฉัน
Zoredache

5
เรียนรู้การใช้งานสคริปต์เพื่อให้บรรลุเป้าหมายของคุณ
Tom O'Connor

คำตอบ:


11

ฉันไม่ทราบวิธีการทำเช่นนี้ใน mysql เอง แต่เชลล์สคริปต์ง่าย ๆ จะทำงาน:

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
วิธีปิดการใช้งานการตรวจสอบกุญแจต่างประเทศ?
realtebo

7

คุณสามารถใช้ MySQL เพื่อเขียนสคริปต์และดำเนินการได้:

สิ่งนี้จะแปลงทุกตาราง InnoDB ในฐานข้อมูลdbnameเป็น 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}

สิ่งนี้จะแปลงทุกตาราง InnoDB เป็น 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}

หากคุณไม่ต้องการให้การแปลงโต๊ะเป็น Slaves ให้SET SQL_LOG_BIN=0;เปลี่ยนเป็นบรรทัดแรก ด้วยวิธีนี้คุณสามารถทดสอบการแปลงในการตั้งค่า Master / Slave โดยการแปลงเฉพาะ Slave ก่อนแล้วจึงเปลี่ยน Master ในภายหลัง

สิ่งนี้จะแปลงทุกตาราง InnoDB ในฐานข้อมูลdbnameเป็น MyISAM และไม่จำลองแบบไปยังเซิร์ฟเวอร์อื่น

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}

สิ่งนี้จะแปลงทุกตาราง InnoDB เป็น MyISAM และไม่ทำซ้ำกับเซิร์ฟเวอร์อื่น

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}

ให้มันลอง !!!


ไปจาก MyIsam2InnoDB ในโลกแห่งความเป็นจริงคุณอาจต้องการที่SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; จะหลีกเลี่ยง no_zero_date ตั้งแต่ mysql 5.7 - Source stackoverflow.com/questions/9192027/…
Antony Gibbs

ไปจาก MyIsam2InnoDB ในโลกแห่งความเป็นจริงคุณอาจต้องการที่SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; จะหลีกเลี่ยง no_zero_date ตั้งแต่ mysql 5.7 - Source stackoverflow.com/questions/9192027/…
Antony Gibbs

0

สำหรับผู้ที่ยังคงมีปัญหานี้คุณสามารถทำตามวิธีนี้ได้ฉันพบคำตอบนี้ในเว็บไซต์ มันช่วยฉันได้มาก:

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

อัปเดต usernameและdb_nameค่าด้วยค่าของคุณเอง

เมื่อรันสคริปต์มันจะบันทึกไฟล์ภายใต้ชื่อ: alter.sql เปิดไฟล์และเรียกใช้เนื้อหาบนบรรทัดคำสั่งของคุณphpmyadminหรือmysql

ไชโย!


-1

ฉันชอบคนที่ชอบซับในสำหรับสิ่งประเภทนี้ นี่เป็นคำตอบที่ยอมรับมากที่สุดรุ่นเดียว

นี้ทำงานได้ถ้าคุณมีชื่อผู้ใช้ MySQL ~/.my.cnfของคุณและตั้งรหัสผ่านใน

D=your_db; for t in $(mysql $D -B -e 'SHOW TABLES'); do mysql $D -e "ALTER TABLE $t ENGINE=MyISAM"; done
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.