<?php
//connect your database here first
//// Actual code starts here
$sql ="SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'your_database_name'
AND ENGINE = 'MyISAM'";$rs = mysql_query($sql);while($row= mysql_fetch_array($rs)){$tbl =$row[0];$sql ="ALTER TABLE `$tbl` ENGINE=INNODB";
mysql_query($sql);}?>
Вероятно, было бы лучше ограничить это базой данных, на которой вы сосредоточены. Добавьте "AND TABLE_SCHEMA = 'dbname', иначе это может / изменит все таблицы MySQL в Интернете на innodb (когда некоторые из них должны быть в памяти)
Лапша
7
mysql_*Интерфейс PHP устарел и удален из версии 7. Не используйте этот код как есть.
Рик Джеймс
4
@GajendraBang - Да, ответ действителен при представлении. Но для новичков это уже не действует. Моим намерением было предостеречь от использования его как есть .
Рик Джеймс
1
Вопрос вообще не
затрагивает
1
Как самое последнее изменение не помечено? Часть MySQL является прямой копией ответа Уилла Джонса. Просмотрите каждую историю изменений, чтобы найти, что ответ Уилла появлялся в 2013 году, а ответ - в 2019 году. В результате целостность этого вопроса была нарушена.
rmutalik
549
Запустите этот оператор SQL (в клиенте MySQL, phpMyAdmin или где-либо еще), чтобы получить все таблицы MyISAM в вашей базе данных.
Замените значение name_of_your_dbпеременной на имя вашей базы данных.
SET@DATABASE_NAME ='name_of_your_db';SELECT CONCAT('ALTER TABLE `', table_name,'` ENGINE=InnoDB;')AS sql_statements
FROM information_schema.tables AS tb
WHERE table_schema =@DATABASE_NAME
AND`ENGINE`='MyISAM'AND`TABLE_TYPE`='BASE TABLE'ORDERBY table_name DESC;
Затем скопируйте вывод и запустите новый SQL-запрос.
«# 1267 незаконное сочетание сортировок ...» Я получаю эту ошибку, она не работает
Rápli András
1
Просто из любопытства, какой смысл в явном порядке убывания? ( ORDER BY table_name DESC)
Риного
12
Если вы имеете дело с несколькими базами данных и не хотите менять базу данных каждый раз, измените CONCAT('ALTER TABLE ', table_name, ' ENGINE=InnoDB;')наCONCAT('ALTER TABLE ',@DATABASE_NAME,'.', table_name, ' ENGINE=InnoDB;')
ub3rst4r
1
Если вы хотите получить операторы для всех баз данных (кроме системных баз данных MySQL): SELECT CONCAT('ALTER TABLE `', table_schema, '`.`', table_name, '` ENGINE=InnoDB;') AS sql_statements FROM information_schema.tables WHERE table_schema NOT IN ('information_schema', 'performance_schema', 'mysql') AND engine = 'MyISAM' AND table_type = 'BASE TABLE' ORDER BY table_schema,table_name
dr fu
61
SELECT CONCAT('ALTER TABLE ',TABLE_NAME,' ENGINE=InnoDB;')FROM INFORMATION_SCHEMA.TABLES
WHERE ENGINE='MyISAM'AND table_schema ='mydatabase';
Работает как шарм.
Это даст вам список всех таблиц с запросами на изменение, которые вы можете запустить в пакете.
После этого вам сначала нужно выполнить следующий запрос: USE databasename; Затем вы можете использовать запросы, которые дает приведенный выше скрипт.
gijs007
Как вы запускаете партию?
Марк Александр
Приведенный выше запрос даст вам возможность изменять запросы к таблицам. просто выберите их все и выполните их вместе. или разделите их на группы по 50 запросов и выполните их, если в наборе результатов слишком много таблиц
Омкар
2
Он работает даже в 2018 году и на кластере Percona. Если использовать его из PHPMyAdmin, вы получите только около 20 имен, а затем «...» или символ пагинации >>. Это означает, что вы должны нажимать и продолжать копировать все последующие страницы, чтобы не пропустить ни одной таблицы. Если вы забудете об этом, вы можете безопасно повторно применить вышеупомянутый запрос, и он даст вам следующие таблицы MyISAM для преобразования.
Дарио Фумагалли
23
В приведенных ниже сценариях замените <username>, <password> и <schema> вашими конкретными данными.
Чтобы показать операторы, которые можно скопировать и вставить в сеанс клиента mysql, введите следующее:
Похоже, что на самом деле это не конвертирует таблицы в InnoDB.
Чарли Шлиссер
3
Это выводит скрипт, который вы затем запускаете для преобразования таблиц - это два шага. Однако он пытается преобразовать таблицы INFORMATION_SCHEMA - это плохо. Необходимо ограничить его правильной базой данных.
Brilliand
1
Вам придется отфильтровать наши внутренние таблицы mysql - в соответствии с документацией «Не преобразовывайте системные таблицы MySQL в базе данных mysql (например, пользователь или хост) в тип InnoDB. Это неподдерживаемая операция. Системные таблицы всегда должны быть типа MyISAM. " ссылка
eug
Без редактирования, чтобы включить комментарий @ eug в этот ответ, я думаю, что он заслуживает отрицательного ответа, хотя в остальном он так же элегантен, как и любой из вариантов на этой странице.
mc0e
Хм. @ charlie-s тоже правильно, и это не дает работающего SQL. Нисходящее голосование кажется мне оправданным.
mc0e
18
Вы можете выполнить этот оператор в инструменте командной строки mysql:
echo "SELECT concat('ALTER TABLE `',TABLE_NAME,'` ENGINE=InnoDB;')
FROM Information_schema.TABLES
WHERE ENGINE != 'InnoDB' AND TABLE_TYPE='BASE TABLE'
AND TABLE_SCHEMA='name-of-database'"| mysql >convert.sql
Вам может потребоваться указать имя пользователя и пароль, используя: mysql -u username -p В результате получается скрипт sql, который можно передать обратно в mysql:
mysql name-of-database <convert.sql
Замените «имя базы данных» в приведенной выше инструкции и командной строке.
@itsraja, "echo" - это команда, поддерживаемая как sh в linux / unix, так и cmd в системах Microsoft, результат передается в виде ввода в инструмент mysql.
Хендрик Браммерманн
2
это правильно. Но вы упомянули как «инструмент командной строки mysql»
israja
1
Кроме того, эхо "SELECT concat (concat ('ALTER TRABLE', TABLE_NAME), 'ENGINE = InnoDB;') ИЗ ТАБЛИЦ, ГДЕ ДВИГАТЕЛЬ! = 'InnoDB' И TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA = 'testinno'" | mysql -u root --sock = / opt / lampp / var / mysql / mysql.sock --database = testinno> convert.sql ОШИБКА 1146 (42S02) в строке 1: таблица 'testinno.TABLES' не существует
Это еще не было упомянуто, поэтому я напишу это для потомков:
Если вы мигрируете между серверами БД (или у вас есть другая причина, по которой вы сбрасываете и перезагружаете свой dta), вы можете просто изменить вывод из mysqldump:
mysql DBNAME < my_schema.sql && mysql DBNAME < my_data.sql
(Кроме того, по моему ограниченному опыту, этот процесс может быть намного быстрее, чем изменение таблиц «вживую». Возможно, это зависит от типа данных и индексов.)
ти! именно то, что я искал. Проверим это через несколько дней.
Райнер
7
Вот способ сделать это для пользователей Django:
from django.core.management.base import BaseCommand
from django.db import connections
class Command(BaseCommand):
def handle(self,database="default",*args,**options):cursor= connections[database].cursor()cursor.execute("SHOW TABLE STATUS");forrowincursor.fetchall():ifrow[1]!="InnoDB":print"Converting %s"%row[0],
result =cursor.execute("ALTER TABLE %s ENGINE=INNODB"%row[0])print result
Добавьте это в свое приложение в папке management / commands /. Затем вы можете преобразовать все свои таблицы с помощью команды manage.py:
Внутри mysql вы можете использовать поиск / замену с помощью текстового редактора:
SELECT table_schema, table_name FROM INFORMATION_SCHEMA.TABLES WHERE engine ='myisam';
Примечание: вы, вероятно, должны игнорировать information_schema и mysql, потому что «Базы данных mysql и information_schema, которые реализуют некоторые из внутренних компонентов MySQL, все еще используют MyISAM. В частности, вы не можете переключить таблицы предоставления для использования InnoDB». ( http://dev.mysql.com/doc/refman/5.5/en/innodb-default-se.html )
В любом случае обратите внимание на таблицы, которые нужно игнорировать и выполнить:
SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE engine ='myisam';
Теперь просто скопируйте / вставьте этот список в ваш текстовый редактор и найдите / замените "|" с "ALTER TABLE" и т. д.
Затем у вас будет такой список, который вы можете просто вставить в свой терминал mysql:
Если ваш текстовый редактор не может сделать это легко, вот другое решение для получения аналогичного списка (который вы можете вставить в mysql) только для одного префикса вашей базы данных из терминала linux:
mysql -u [username]-p[password]-B -N -e 'show tables like "arth_%"'[database name]| xargs -I '{}' echo "ALTER TABLE {} ENGINE=INNODB;"
Вы можете просто запустить исполняемый файл mysql, использовать базу данных и скопировать и вставить запрос.
Это преобразует все таблицы MyISAM в текущей базе данных в таблицы INNODB.
DROP PROCEDURE IF EXISTS convertToInnodb;
DELIMITER //
CREATE PROCEDURE convertToInnodb()BEGIN
mainloop: LOOP
SELECT TABLE_NAME INTO @convertTable FROM information_schema.TABLES
WHERE `TABLE_SCHEMA` LIKE DATABASE()
AND `ENGINE` LIKE 'MyISAM' ORDER BY TABLE_NAME LIMIT 1;
IF @convertTable IS NULL THEN
LEAVE mainloop;END IF;
SET @sqltext:= CONCAT('ALTER TABLE `', DATABASE(),'`.`',@convertTable,'` ENGINE = INNODB');
PREPARE convertTables FROM @sqltext;
EXECUTE convertTables;
DEALLOCATE PREPARE convertTables;
SET @convertTable= NULL;END LOOP mainloop;END//
DELIMITER ;
CALL convertToInnodb();
DROP PROCEDURE IF EXISTS convertToInnodb;
Я новичок и должен был найти свое собственное решение, потому что команды mysql в Интернете, как правило, пронизаны орфографическими ошибками, которые создают настоящий кошмар для людей, только начинающих. Вот мое решение ....
Вместо одной команды на таблицу я подготовил десятки команд (готовых к копированию и вставке) одновременно, используя Excel.
Как? разверните окно замазки и введите mysql, а затем выполните команду "SHOW TABLE STATUS;" и скопируйте / вставьте вывод в Microsoft Excel. Перейдите на вкладку «Данные» и используйте функцию «текст в столбцы», разделяя столбцы клавишей пробела. Затем отсортируйте столбцы по тому, какой столбец показывает типы таблиц, и удалите все строки, таблицы которых уже находятся в формате InnoDb (поскольку нам не нужно запускать команды для них, они уже выполнены). Затем добавьте 2 столбца слева от столбца таблиц и 2 столбца справа. Затем вставьте первую часть команды в столбец-1 (см. Ниже). Колонка 2 должна содержать только пробел. Столбец 3 - это столбец вашей таблицы. Колонка 4 должна содержать только пробел. Колонка 5 - последняя часть вашей команды. Это должно выглядеть так:
Затем скопируйте и вставьте около 5 строк одновременно в MySQL. Это преобразует около 5 сразу. Я заметил, что если я сделаю больше, чем сразу, то команды потерпят неудачу.
<?php
$host ="host";$user="user";$pass ="pss";$database="db_name";$connect= new mysqli($host,$user,$pass,$database);// Actual code starts here Dont forget to change db_name !!$sql ="SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'db_name'
AND ENGINE = 'MyISAM'";$rs =$connect->query($sql);while($row=$rs->fetch_array()){$tbl =$row[0];$sql ="ALTER TABLE `$tbl` ENGINE=INNODB";$connect->query($sql);}?>
Еще один вариант ... Вот как это сделать в ANSIBLE. Предполагается, что имя вашей базы данных находится в dbnameи что вы уже настроили доступ.
- name: Get list of DB tables that need converting to InnoDB
command:>
mysql --batch --skip-column-names --execute="SELECT TABLE_NAMEFROM information_schema.TABLES
WHERE TABLE_SCHEMA ='{{ dbname }}'AND ENGINE ='MyISAM';"
register: converttables
check_mode: no
changed_when: False
- name: Convert any unconverted tables
command: >
mysql --batch --skip-column-names --execute="ALTERTABLE`{{ dbname }}`.`{{ item }}` ENGINE = InnoDB;"
with_items: "{{ converttables.stdout_lines }}"
Ответы:
источник
mysql_*
Интерфейс PHP устарел и удален из версии 7. Не используйте этот код как есть.Запустите этот оператор SQL (в клиенте MySQL, phpMyAdmin или где-либо еще), чтобы получить все таблицы MyISAM в вашей базе данных.
Замените значение
name_of_your_db
переменной на имя вашей базы данных.Затем скопируйте вывод и запустите новый SQL-запрос.
источник
ORDER BY table_name DESC
)CONCAT('ALTER TABLE ', table_name, ' ENGINE=InnoDB;')
наCONCAT('ALTER TABLE ',@DATABASE_NAME,'.', table_name, ' ENGINE=InnoDB;')
SELECT CONCAT('ALTER TABLE `', table_schema, '`.`', table_name, '` ENGINE=InnoDB;') AS sql_statements FROM information_schema.tables WHERE table_schema NOT IN ('information_schema', 'performance_schema', 'mysql') AND engine = 'MyISAM' AND table_type = 'BASE TABLE' ORDER BY table_schema,table_name
Работает как шарм.
Это даст вам список всех таблиц с запросами на изменение, которые вы можете запустить в пакете.
источник
В приведенных ниже сценариях замените <username>, <password> и <schema> вашими конкретными данными.
Чтобы показать операторы, которые можно скопировать и вставить в сеанс клиента mysql, введите следующее:
Чтобы просто выполнить изменение, используйте это:
КРЕДИТ: это вариант того, что было изложено в этой статье .
источник
Одна линия:
источник
"$1"
в обратные черты вот так:`"$1"`
похоже на то, что в моем ответе.Используйте это как SQL-запрос в вашем phpMyAdmin
источник
Вы можете выполнить этот оператор в инструменте командной строки mysql:
Вам может потребоваться указать имя пользователя и пароль, используя: mysql -u username -p В результате получается скрипт sql, который можно передать обратно в mysql:
Замените «имя базы данных» в приведенной выше инструкции и командной строке.
источник
-bash: ,TABLE_NAME,: command not found
Это очень просто, есть только ДВА шага, просто скопируйте и вставьте:
шаг 1.
(скопируйте и вставьте весь результат в закладку sql)
шаг 2: (скопировать все результаты в закладке sql) и вставить ниже в строке
НАЧАТЬ СДЕЛКУ;
COMMIT;
например. НАЧАТЬ СДЕЛКУ;
ALTER TABLE
admin_files
ENGINE = InnoDB;COMMIT;
источник
Чтобы сгенерировать операторы ALTER для всех таблиц во всех несистемных схемах, упорядоченных по этим схемам / таблицам, выполните следующее:
После этого запустите эти запросы через клиента, чтобы выполнить изменение.
источник
Это еще не было упомянуто, поэтому я напишу это для потомков:
Если вы мигрируете между серверами БД (или у вас есть другая причина, по которой вы сбрасываете и перезагружаете свой dta), вы можете просто изменить вывод из
mysqldump
:Затем загрузите его снова:
(Кроме того, по моему ограниченному опыту, этот процесс может быть намного быстрее, чем изменение таблиц «вживую». Возможно, это зависит от типа данных и индексов.)
источник
Вот способ сделать это для пользователей Django:
Добавьте это в свое приложение в папке management / commands /. Затем вы можете преобразовать все свои таблицы с помощью команды manage.py:
источник
Внутри mysql вы можете использовать поиск / замену с помощью текстового редактора:
Примечание: вы, вероятно, должны игнорировать information_schema и mysql, потому что «Базы данных mysql и information_schema, которые реализуют некоторые из внутренних компонентов MySQL, все еще используют MyISAM. В частности, вы не можете переключить таблицы предоставления для использования InnoDB». ( http://dev.mysql.com/doc/refman/5.5/en/innodb-default-se.html )
В любом случае обратите внимание на таблицы, которые нужно игнорировать и выполнить:
Теперь просто скопируйте / вставьте этот список в ваш текстовый редактор и найдите / замените "|" с "ALTER TABLE" и т. д.
Затем у вас будет такой список, который вы можете просто вставить в свой терминал mysql:
Если ваш текстовый редактор не может сделать это легко, вот другое решение для получения аналогичного списка (который вы можете вставить в mysql) только для одного префикса вашей базы данных из терминала linux:
источник
Простая версия MySQL.
Вы можете просто запустить исполняемый файл mysql, использовать базу данных и скопировать и вставить запрос.
Это преобразует все таблицы MyISAM в текущей базе данных в таблицы INNODB.
источник
используйте эту строку, чтобы изменить ядро базы данных для одной таблицы.
источник
Я новичок и должен был найти свое собственное решение, потому что команды mysql в Интернете, как правило, пронизаны орфографическими ошибками, которые создают настоящий кошмар для людей, только начинающих. Вот мое решение ....
Вместо одной команды на таблицу я подготовил десятки команд (готовых к копированию и вставке) одновременно, используя Excel.
Как? разверните окно замазки и введите mysql, а затем выполните команду "SHOW TABLE STATUS;" и скопируйте / вставьте вывод в Microsoft Excel. Перейдите на вкладку «Данные» и используйте функцию «текст в столбцы», разделяя столбцы клавишей пробела. Затем отсортируйте столбцы по тому, какой столбец показывает типы таблиц, и удалите все строки, таблицы которых уже находятся в формате InnoDb (поскольку нам не нужно запускать команды для них, они уже выполнены). Затем добавьте 2 столбца слева от столбца таблиц и 2 столбца справа. Затем вставьте первую часть команды в столбец-1 (см. Ниже). Колонка 2 должна содержать только пробел. Столбец 3 - это столбец вашей таблицы. Колонка 4 должна содержать только пробел. Колонка 5 - последняя часть вашей команды. Это должно выглядеть так:
Затем скопируйте и вставьте около 5 строк одновременно в MySQL. Это преобразует около 5 сразу. Я заметил, что если я сделаю больше, чем сразу, то команды потерпят неудачу.
источник
В моем случае я выполнял миграцию с экземпляра MySQL по умолчанию MyISAM на экземпляр MariaDB с DEFAULT InnoDB.
За MariaDB миграционные документы.
На старом сервере запустить:
Параметр --skip-create-options гарантирует, что сервер базы данных при загрузке данных использует механизм хранения по умолчанию вместо MyISAM.
Это вызвало ошибку при создании mysql.db, но теперь все работает отлично :)
источник
Просто опробовал другой (простой?) Способ и работал на меня.
Просто экспортируйте свою БД как файл .sql, отредактируйте его с помощью gedit или блокнота;
Заменить
ENGINE=MyISAM
наENGINE=INNODB
и сохранить отредактированный файлНомер или замена должна быть номером ваших столов
Импортируйте его в MySQL (phpMyAdmin или командная строка)
И вуаля!
источник
Вы можете написать сценарий, чтобы сделать это на вашем любимом языке сценариев. Скрипт будет делать следующее:
SHOW FULL TABLES
.'BASE TABLE'
а не'VIEW'
.'VIEW'
, введите соответствующуюALTER TABLE
команду.источник
Попробуйте этот сценарий оболочки
источник
Некоторые исправления в этом скрипте
источник
источник
Это простой скрипт php.
источник
источник
для подключения mysqli;
источник
Еще один вариант ... Вот как это сделать в ANSIBLE. Предполагается, что имя вашей базы данных находится в
dbname
и что вы уже настроили доступ.источник
cd / var / lib / mysql / DBNAME
ls | grep ".frm" | cut -d "." -f1 | xargs -I {} -n1 mysql -D DBNAME -e "изменить таблицу {} ENGINE = INNODB;" -uroot -pXXXXX
источник