Відповіді:
<?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);
}
?>
mysql_*
Інтерфейс PHP застарілий і видалений з версії 7. Не використовуйте цей код як є.
Запустіть цей оператор 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'
ORDER BY table_name DESC;
Потім скопіюйте вихід і запустіть як новий 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
SELECT CONCAT('ALTER TABLE ',TABLE_NAME,' ENGINE=InnoDB;')
FROM INFORMATION_SCHEMA.TABLES
WHERE ENGINE='MyISAM'
AND table_schema = 'mydatabase';
Працює як шарм.
Це дасть вам список усіх таблиць із запитами до змін, які ви можете виконувати в пакеті
У сценаріях нижче замініть <username>, <password> та <schema> на ваші конкретні дані.
Щоб показати заяви, які можна скопіювати та вставити в клієнтську сесію mysql, введіть наступне:
echo 'SHOW TABLES;' \
| mysql -u <username> --password=<password> -D <schema> \
| awk '!/^Tables_in_/ {print "ALTER TABLE `"$0"` ENGINE = InnoDB;"}' \
| column -t \
Щоб просто виконати зміну, скористайтеся цим:
echo 'SHOW TABLES;' \
| mysql -u <username> --password=<password> -D <schema> \
| awk '!/^Tables_in_/ {print "ALTER TABLE `"$0"` ENGINE = InnoDB;"}' \
| column -t \
| mysql -u <username> --password=<password> -D <schema>
КРЕДИТ: Це варіація того, що було викладено в цій статті .
Один рядок:
mysql -u root -p dbName -e
"show table status where Engine='MyISAM';" | awk
'NR>1 {print "ALTER TABLE "$1" ENGINE = InnoDB;"}' |
mysql -u root -p dbName
"$1"
: `"$1"`
як у моїй відповіді.
Використовуйте це як sql-запит у вашому phpMyAdmin
SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' engine=InnoDB;')
FROM information_schema.tables
WHERE engine = 'MyISAM';
Ви можете виконати цю операцію в інструменті командного рядка 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
Замініть "ім'я бази даних" у наведеному вище твердженні та командному рядку.
-bash: ,TABLE_NAME,: command not found
Дуже просто: копіюйте та вставляйте лише два кроки:
крок 1.
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' ORDER BY table_name DESC;
(скопіюйте та вставте всі результати на вкладку sql)
крок 2: (скопіюйте всі результати на вкладку sql) і вставте внизу рядок
СТАРТОВА ТРАНЗАКЦІЯ;
КОМІТЕТ;
напр. СТАРТОВА ТРАНЗАКЦІЯ;
ALTER TABLE admin_files
ENGINE = InnoDB;
КОМІТЕТ;
Для генерації операторів ALTER для всіх таблиць у всіх несистемних схемах, упорядкованих цими схемами / таблицями, виконайте наступне:
SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.', table_name, ' ENGINE=InnoDB;') AS sql_statements
FROM information_schema.tables
WHERE TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema', 'innodb', 'sys', 'tmp')
AND `ENGINE` = 'MyISAM'
AND `TABLE_TYPE` = 'BASE TABLE'
ORDER BY TABLE_SCHEMA, table_name DESC;
Після цього запустіть ці запити через клієнт, щоб виконати зміну.
Це ще не було згадано, тому я напишу це для нащадків:
Якщо ви мігруєте між серверами БД (або маєте іншу причину, щоб ви скинули та перезавантажили свій dta), ви можете просто змінити вихід з mysqldump
:
mysqldump --no-data DBNAME | sed 's/ENGINE=MyISAM/ENGINE=InnoDB/' > my_schema.sql;
mysqldump --no-create-info DBNAME > my_data.sql;
Потім завантажте його ще раз:
mysql DBNAME < my_schema.sql && mysql DBNAME < my_data.sql
(Крім того, за моїм обмеженим досвідом, це може бути набагато швидшим процесом, ніж зміна таблиць "наживо". Це, мабуть, залежить від типу даних та індексів.)
Ось як це зробити для користувачів 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");
for row in cursor.fetchall():
if row[1] != "InnoDB":
print "Converting %s" % row[0],
result = cursor.execute("ALTER TABLE %s ENGINE=INNODB" % row[0])
print result
Додайте це у свою програму під керуванням папками / командами / Потім ви можете конвертувати всі ваші таблиці за допомогою команди Manag.py:
python manage.py convert_to_innodb
Зсередини 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/uk/innodb-default-se.html )
У будь-якому випадку, зверніть увагу на таблиці, щоб ігнорувати та запускати:
SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE engine = 'myisam';
Тепер просто скопіюйте та вставте цей список у свій текстовий редактор та виконайте пошук / заміну "|" з "ALTER TABLE" тощо
Потім у вас з'явиться такий список, який ви можете просто вставити у свій термінал mysql:
ALTER TABLE arth_commentmeta ENGINE=Innodb;
ALTER TABLE arth_comments ENGINE=Innodb;
ALTER TABLE arth_links ENGINE=Innodb;
ALTER TABLE arth_options ENGINE=Innodb;
ALTER TABLE arth_postmeta ENGINE=Innodb;
ALTER TABLE arth_posts ENGINE=Innodb;
ALTER TABLE arth_term_relationships ENGINE=Innodb;
ALTER TABLE arth_term_taxonomy ENGINE=Innodb;
ALTER TABLE arth_terms ENGINE=Innodb;
ALTER TABLE arth_usermeta ENGINE=Innodb;
Якщо ваш текстовий редактор не може це зробити легко, ось інше рішення для отримання подібного списку (який ви можете вставити в mysql) лише для одного префікса вашої бази даних, з терміналу Linux:
mysql -u [username] -p[password] -B -N -e 'show tables like "arth_%"' [database name] | xargs -I '{}' echo "ALTER TABLE {} ENGINE=INNODB;"
Проста версія MySQL.
Ви можете просто запустити виконуваний файл 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 в Інтернеті, як правило, пронизані написанням помилок, створюють справжній кошмар життя для людей, які тільки починаються. Ось моє рішення….
Замість 1 команди на таблицю я підготував одразу кілька десятків команд (готових до копіювання та вставки) за допомогою excel.
Як? розгорніть вікно шпаклівки і введіть mysql, а потім запустіть команду "ПОКАЗАТИ СТАТУТ ТАБЛИЦІ;" і скопіюйте / вставте вихід у Microsoft Excel. Перейдіть на вкладку Дані та використовуйте функцію "текст у стовпці", щоб розділити стовпчики пробілом. Потім сортуйте стовпці за будь-яким стовпцем, що показує типи ваших таблиць, і видаліть усі рядки, які таблиці вже є у форматі InnoDb (оскільки нам не потрібно запускати команди проти них, вони вже готові). Потім додайте 2 стовпчики зліва від стовпця таблиць і 2 стовпчики праворуч. Потім вставте першу частину команди у стовпчик-1 (див. Нижче). У колонці 2 має бути лише пробіл. Колонка 3 - це стовпчик ваших таблиць. У колонці 4 має бути лише пробіл. Колонка 5 - остання частина вашої команди. Це повинно виглядати так:
column-1 column-2 column-3 column-4 column-5
ALTER TABLE t_lade_tr ENGINE=InnoDB;
ALTER TABLE t_foro_detail_ms ENGINE=InnoDB;
ALTER TABLE t_ljk_ms ENGINE=InnoDB;
Потім скопіюйте та вставте приблизно 5 рядків одночасно в mysql. Це перетворить приблизно 5 відразу. Я помітив, якби я зробив більше, ніж одразу, тоді команди не зможуть.
У моєму випадку я переходив з екземпляра MySQL із замовчуванням MyISAM, на екземпляр MariaDB із DEFAULT InnoDB.
Документи щодо міграції на MariaDB
На старому сервері:
mysqldump -u root -p --skip-create-options --all-databases > migration.sql
Параметри --skip-create-забезпечує, що сервер баз даних використовує двигун зберігання за замовчуванням під час завантаження даних, а не MyISAM.
mysql -u root -p < migration.sql
Це призвело до помилки щодо створення mysql.db, але зараз усе працює чудово :)
Просто випробував інший (простий?) Спосіб і працював на мене.
Просто експортуйте свій БД як .sql файл, відредагуйте його за допомогою gedit або блокнота;
Замініть ENGINE=MyISAM
наENGINE=INNODB
і зберегти файл відредагований
Кількість або виконана заміна має бути числом ваших таблиць
Імпортуйте його в MySQL (phpMyAdmin або командний рядок)
І Вуаля!
Ви можете написати сценарій, щоб зробити це улюбленою мовою сценаріїв. Сценарій зробив би наступне:
SHOW FULL TABLES
.'BASE TABLE'
а ні'VIEW'
.'VIEW'
, видайте відповідну ALTER TABLE
команду.Спробуйте цей скрипт оболонки
DBENGINE='InnoDB' ;
DBUSER='your_db_user' ;
DBNAME='your_db_name' ;
DBHOST='your_db_host'
DBPASS='your_db_pass' ;
mysqldump --add-drop-table -h$DBHOST -u$DBUSER -p$DBPASS $DBNAME > mtest.sql; mysql -h$DBHOST -u$DBUSER -p$DBPASS $DBNAME -Nse "SHOW TABLES;" | while read TABLE ; do mysql -h$DBHOST -u$DBUSER -p$DBPASS $DBNAME -Nse "ALTER TABLE $TABLE ENGINE=$DBENGINE;" ; done
Деякі виправлення цього сценарію утиліти
SET @DATABASE_NAME = 'Integradb';
SELECT CONCAT('ALTER TABLE ', table_schema, '.', 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'
ORDER BY table_name DESC;
<?php
// connect your database here first
mysql_connect('host', 'user', 'pass');
$databases = mysql_query('SHOW databases');
while($db = mysql_fetch_array($databases)) {
echo "database => {$db[0]}\n";
mysql_select_db($db[0]);
$tables = mysql_query('SHOW tables');
while($tbl = mysql_fetch_array($tables)) {
echo "table => {$tbl[0]}\n";
mysql_query("ALTER TABLE {$tbl[0]} ENGINE=MyISAM");
}
}
Це простий скрипт для php.
<?php
@error_reporting(E_ALL | E_STRICT);
@ini_set('display_errors', '1');
$con = mysql_connect('server', 'user', 'pass');
$dbName = 'moodle2014';
$sql = "SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '".$dbName."';";
$rs = mysql_query($sql, $con);
$count = 0;
$ok = 0;
while($row = mysql_fetch_array($rs)){
$count ++;
$tbl = $row[0];
$sql = "ALTER TABLE ".$dbName.".".$tbl." ENGINE=INNODB;";
$resultado = mysql_query($sql);
if ($resultado){
$ok ++;
echo $sql."<hr/>";
}
}
if ($count == $ok){
echo '<div style="color: green"><b>ALL OK</b></div>';
}else{
echo '<div style="color: red"><b>ERRORS</b>Total tables: '.$count.', updated tables:'.$ok.'</div>';
}
<?php
// Convert all MyISAM tables to INNODB tables in all non-special databases.
// Note: With MySQL less than 5.6, tables with a fulltext search index cannot be converted to INNODB and will be skipped.
if($argc < 4)
exit("Usage: {$argv[0]} <host> <username> <password>\n");
$host = $argv[1];
$username = $argv[2];
$password = $argv[3];
// Connect to the database.
if(!mysql_connect($host, $username, $password))
exit("Error opening database. " . mysql_error() . "\n");
// Get all databases except special ones that shouldn't be converted.
$databases = mysql_query("SHOW databases WHERE `Database` NOT IN ('mysql', 'information_schema', 'performance_schema')");
if($databases === false)
exit("Error showing databases. " . mysql_error() . "\n");
while($db = mysql_fetch_array($databases))
{
// Select the database.
if(!mysql_select_db($db[0]))
exit("Error selecting database: {$db[0]}. " . mysql_error() . "\n");
printf("Database: %s\n", $db[0]);
// Get all MyISAM tables in the database.
$tables = mysql_query("SHOW table status WHERE Engine = 'MyISAM'");
if($tables === false)
exit("Error showing tables. " . mysql_error() . "\n");
while($tbl = mysql_fetch_array($tables))
{
// Convert the table to INNODB.
printf("--- Converting %s\n", $tbl[0]);
if(mysql_query("ALTER TABLE `{$tbl[0]}` ENGINE = INNODB") === false)
printf("--- --- Error altering table: {$tbl[0]}. " . mysql_error() . "\n");
}
}
mysql_close();
?>
для mysqli connect;
<?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_NAME
FROM 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="ALTER TABLE `{{ dbname }}`.`{{ item }}` ENGINE = InnoDB;"
with_items: "{{ converttables.stdout_lines }}"