Modo più semplice per convertire tutte le tabelle da InnoDB a MyISAM


13

In precedenza, ho usato questo:

USE dbname;
ALTER TABLE tablename ENGINE=MYISAM;

Sto cercando un modo più semplice per convertire tutte le tabelle in un database, piuttosto che scrivere ogni nome di tabella uno per uno


1
Più semplice come? Mi sembra abbastanza semplice.
Zoredache,

5
Impara a utilizzare gli script per raggiungere i tuoi obiettivi.
Tom O'Connor,

Risposte:


11

Non sono a conoscenza di alcun modo per farlo in mysql stesso, ma un semplice script di shell farà il lavoro:

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
come disabilitare il controllo delle chiavi esterne?
realtebo,

7

Puoi usare MySQL per copiarlo ed eseguirlo:

Ciò convertirà ogni tabella InnoDB nel database dbnamein 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}

Questo convertirà ogni tabella InnoDB in 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}

Se non si desidera replicare la conversione delle tabelle in Slave, basta inserire SET SQL_LOG_BIN=0;la prima riga. In questo modo, è possibile testare la conversione in una configurazione Master / Slave convertendo prima solo lo Slave e successivamente il Master.

Ciò convertirà ogni tabella InnoDB nel database dbnamein MyISAM e non replicherà su altri server

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}

Questo convertirà ogni tabella InnoDB in MyISAM e non replicherà su altri server

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}

Provaci !!!


Passando da MyIsam2InnoDB nel mondo reale probabilmente vorrai un SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; posto dove aggirare il no_zero_date da mysql 5.7 - Fonte stackoverflow.com/questions/9192027/…
Antony Gibbs

Passando da MyIsam2InnoDB nel mondo reale probabilmente vorrai un SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; posto dove aggirare il no_zero_date da mysql 5.7 - Fonte stackoverflow.com/questions/9192027/…
Antony Gibbs

0

Per coloro che hanno ancora questo problema, puoi seguire questo modo per farlo, ho trovato questa risposta in un sito web. Mi aiuta molto:

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

Aggiornamento usernamee db_namevalori con i tuoi valori.

AFET l'esecuzione dello script, si salva un file sotto il nome: alter.sql Aprire il file ed eseguire il contenuto di tuo phpmyadmino mysqlriga di comando.

Saluti!


-1

Preferisco una linea per questo tipo di cose. Questa è una versione di una riga della risposta più accettata.

Funziona se hai il tuo nome utente e password MySQL impostati ~/.my.cnf.

D=your_db; for t in $(mysql $D -B -e 'SHOW TABLES'); do mysql $D -e "ALTER TABLE $t ENGINE=MyISAM"; done
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.