Tüm tabloları InnoDB'den MyISAM'a dönüştürmenin daha kolay yolu


13

Daha önce, bunu kullanıyorum:

USE dbname;
ALTER TABLE tablename ENGINE=MYISAM;

Her tablo adını tek tek yazmak yerine, bir veritabanındaki tüm tabloları dönüştürmek için daha basit bir yol arıyorum


1
Nasıl daha basit? Bu benim için oldukça basit görünüyor.
Zoredache

5
Hedeflerinize ulaşmak için komut dosyası kullanmayı öğrenin.
Tom O'Connor

Yanıtlar:


11

Bunu mysql kendisi yapmak için herhangi bir yol farkında değilim, ama basit bir kabuk komut dosyası iş yapacak:

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
yabancı anahtar kontrolü nasıl devre dışı bırakılır?
realtebo

7

MySQL'i komut dosyası oluşturmak ve yürütmek için kullanabilirsiniz:

Bu veritabanında her InnoDB'nin tablo dönüştürür dbnameMyISAM için

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}

Bu, tüm InnoDB tablolarını MyISAM'e dönüştürür

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}

Tabloların dönüştürülmesinin Kölelere çoğaltılmasını istemiyorsanız, sadece SET SQL_LOG_BIN=0;ilk satır olarak koyun . Bu şekilde, bir Master / Slave kurulumunda dönüşümü yalnızca önce Slave'i ve sonra Master'ı dönüştürerek test edebilirsiniz.

Bu, veritabanındaki her InnoDB tablosunu MyISAM'a dönüştürür dbnameve diğer sunuculara çoğaltılmaz

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}

Bu, her InnoDB tablosunu MyISAM'e dönüştürür ve diğer sunuculara çoğaltılmaz

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}

Bir şans ver !!!


MyIsam2InnoDB'den gerçek dünyaya giderseniz, muhtemelen bir SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; yerde mysql 5.7'den beri no_zero_date'yi atlamak isteyeceksiniz - Source stackoverflow.com/questions/9192027/…
Antony Gibbs

MyIsam2InnoDB'den gerçek dünyaya giderseniz, muhtemelen bir SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; yerde mysql 5.7'den beri no_zero_date'yi atlamak isteyeceksiniz - Source stackoverflow.com/questions/9192027/…
Antony Gibbs

0

Hala bu sorunu yaşayanlar için, bunu yapmak için bu yolu takip edebilirsiniz, bu cevabı bir web sitesinde buldum. Bana çok yardımcı oluyor:

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

Güncelleme usernameve db_namedeğerler kendi değerlerinizle.

Afet betiği çalıştırdığınızda, dosya adı altında kaydedilecektir: alter.sql Dosyayı açın ve içeriği sizin phpmyadminveya mysqlkomut satırınız üzerinde yürütün .

Şerefe!


-1

Bu tür şeyler için tek astarları tercih ederim. Bu, en çok kabul edilen cevabın tek katlı bir versiyonudur.

MySQL kullanıcı adınız ve şifreniz ayarlanmışsa bu işe yarar ~/.my.cnf.

D=your_db; for t in $(mysql $D -B -e 'SHOW TABLES'); do mysql $D -e "ALTER TABLE $t ENGINE=MyISAM"; done
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.