<?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);}?>
Prawdopodobnie lepiej byłoby ograniczyć to do bazy danych, na której się koncentrujesz. Dodaj „AND TABLE_SCHEMA = 'dbname', w przeciwnym razie może to / spowoduje zmianę wszystkich internetowych tabel MySQL na innodb (gdy niektóre z nich powinny być pamięcią)
Noodles
7
mysql_*Interfejs PHP jest przestarzały i usunięty z wersji 7. Nie używaj tego kodu w obecnej postaci.
Rick James
4
@GajendraBang - Tak, odpowiedź jest ważna, gdy zostanie przedstawiona. Ale dla nowo przybyłych nie jest już ważny. Moim zamiarem było ostrzec przed użyciem go w obecnej postaci .
Rick James
1
Pytanie nie wspomina w ogóle o PHP
phil294
1
W jaki sposób najnowsza edycja nie jest oflagowana? Część MySQL jest bezpośrednią kopią odpowiedzi Willa Jonesa. Spójrz na każdą historię edycji, aby stwierdzić, że odpowiedź Willa pojawiła się w 2013 r., Podczas gdy ta odpowiedź pojawiła się w 2019 r. W rezultacie integralność tego pytania jest zagrożona.
rmutalik
549
Uruchom tę instrukcję SQL (w kliencie MySQL, phpMyAdmin lub gdziekolwiek), aby pobrać wszystkie tabele MyISAM w bazie danych.
Zamień wartość name_of_your_dbzmiennej na nazwę bazy danych.
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;
Następnie skopiuj dane wyjściowe i uruchom jako nowe zapytanie SQL.
„# 1267 nielegalna mieszanka zestawień ...” Otrzymuję ten błąd, to nie działa
Rápli András
1
Właśnie z ciekawości, jaki jest sens wyraźnego malejącego porządku? ( ORDER BY table_name DESC)
rinogo,
12
Jeśli masz do czynienia z wieloma bazami danych i nie chcesz zmieniać bazy danych za każdym razem, zmień CONCAT('ALTER TABLE ', table_name, ' ENGINE=InnoDB;')naCONCAT('ALTER TABLE ',@DATABASE_NAME,'.', table_name, ' ENGINE=InnoDB;')
ub3rst4r
1
Jeśli chcesz uzyskać instrukcje dla wszystkich baz danych (z wyjątkiem baz danych systemowych 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 manchu
61
SELECT CONCAT('ALTER TABLE ',TABLE_NAME,' ENGINE=InnoDB;')FROM INFORMATION_SCHEMA.TABLES
WHERE ENGINE='MyISAM'AND table_schema ='mydatabase';
Działa jak marzenie.
Spowoduje to wyświetlenie listy wszystkich tabel z zapytaniami alter, które można uruchomić w partii
Po uruchomieniu należy najpierw wykonać następujące zapytanie: USE nazwa bazy danych; Następnie możesz użyć zapytań, które daje powyższy skrypt.
gijs007
Jak prowadzisz partię?
Marc Alexander
Powyższe zapytanie da ci możliwość zmiany zapytań w tabeli. po prostu zaznacz je wszystkie i wykonaj je razem. lub podziel je na grupy po 50 zapytań i uruchom je, jeśli zestaw wyników zawiera zbyt wiele tabel
Omkar Kulkarni
2
Działa nawet w 2018 roku i w klastrze Percona. Jeśli używasz go z PHPMyAdmin, otrzymasz tylko około 20 nazw, a następnie „...” lub symbol paginacji >>. Oznacza to, że musisz kliknąć i kontynuować kopiowanie wszystkich kolejnych stron, aby nie przegapić żadnego stołu. Jeśli zapomnisz o tym, możesz bezpiecznie ponownie zastosować powyższe zapytanie, a otrzymasz kolejne tabele MyISAM do konwersji.
Dario Fumagalli
23
W poniższych skryptach zastąp <nazwa użytkownika>, <hasło> i <schemat> swoimi konkretnymi danymi.
Aby wyświetlić instrukcje, które można skopiować i wkleić do sesji klienta mysql, wpisz następujące polecenie:
Nie wydaje się, aby faktycznie konwertowało tabele na InnoDB.
Charlie Schliesser
3
Spowoduje to wygenerowanie skryptu, który następnie uruchomisz, aby przekonwertować tabele - to dwa kroki. Próbuje jednak przekonwertować tabele INFORMACJE_SCHEMA - to zła rzecz. Musisz ograniczyć go do właściwej bazy danych.
Brilliand
1
Będziesz musiał przefiltrować nasze wewnętrzne tabele mysql - zgodnie z dokumentacją „Nie konwertuj tabel systemowych MySQL w bazie danych mysql (takich jak użytkownik lub host) do typu InnoDB. Jest to nieobsługiwana operacja. Tabele systemowe muszą zawsze być typu MyISAM. ” link
sierpień
Bez edytowania w celu uwzględnienia komentarza @ eug w tej odpowiedzi, uważam, że zasługuje na głosowanie w dół, choć poza tym jest tak eleganckie jak każdy z wariantów na tej stronie.
mc0e,
Hmm @ charlie-s jest również poprawny, a to nie tworzy działającego SQL. Głosowanie w dół wydaje mi się uzasadnione.
mc0e,
18
Możesz wykonać tę instrukcję w narzędziu wiersza poleceń 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
Konieczne może być podanie nazwy użytkownika i hasła za pomocą: mysql -u nazwa użytkownika -p Wynikiem jest skrypt sql, który można przesłać z powrotem do mysql:
mysql name-of-database <convert.sql
Zamień „nazwa-bazy danych” w powyższej instrukcji i wierszu poleceń.
@itsraja, „echo” jest poleceniem obsługiwanym zarówno przez sh w systemie Linux / Unix, jak i cmd w systemach Microsoft, wynik jest przesyłany w postaci danych wejściowych do narzędzia mysql.
Hendrik Brummermann
2
Zgadza się. Ale wspomniałeś o „narzędziu wiersza poleceń mysql”
jego
1
Ponadto echo „WYBIERZ konkat (concat („ ALTER TRABLE ”, TABLE_NAME),„ SILNIK = InnoDB; ”) Z TABEL, GDZIE SILNIK! =„ InnoDB ”I TABELA_TYPU =„ TABELA PODSTAWOWA ”ORAZ TABELA_SCHEMA =„ testinno ”” | mysql -u root --sock = / opt / lampp / var / mysql / mysql.sock --database = testinno> convert.sql BŁĄD 1146 (42S02) w linii 1: Tabela 'testinno.TABLES' nie istnieje
Aby wygenerować instrukcje ALTER dla wszystkich tabel we wszystkich schematach niesystemowych, uporządkowane według tych schematów / tabel, wykonaj następujące czynności:
SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.', table_name,' ENGINE=InnoDB;')AS sql_statements
FROM information_schema.tables
WHERE TABLE_SCHEMA NOTIN('mysql','information_schema','performance_schema','innodb','sys','tmp')AND`ENGINE`='MyISAM'AND`TABLE_TYPE`='BASE TABLE'ORDERBY TABLE_SCHEMA, table_name DESC;
Następnie uruchom te zapytania za pośrednictwem klienta, aby wykonać zmianę.
Odpowiedź opiera się na powyższych odpowiedziach, ale poprawia obsługę schematu.
Nie zostało jeszcze wspomniane, więc napiszę to dla potomności:
Jeśli przeprowadzasz migrację między serwerami DB (lub masz inny powód, dla którego zrzucisz i przeładujesz dta), możesz po prostu zmodyfikować dane wyjściowe z mysqldump:
mysql DBNAME < my_schema.sql && mysql DBNAME < my_data.sql
(Ponadto, według mojego ograniczonego doświadczenia, może to być znacznie szybszy proces niż zmiana tabel „na żywo”. Prawdopodobnie zależy to od rodzaju danych i indeksów.)
ty! dokładnie to, czego szukałem. Przetestuję to za kilka dni.
Rainer
7
Oto sposób, aby to zrobić dla użytkowników 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
Dodaj to do swojej aplikacji w folderze zarządzanie / komendy / Następnie możesz przekonwertować wszystkie tabele za pomocą komendy manage.py:
Z poziomu mysql możesz użyć funkcji wyszukiwania / zamiany za pomocą edytora tekstu:
SELECT table_schema, table_name FROM INFORMATION_SCHEMA.TABLES WHERE engine ='myisam';
Uwaga: Prawdopodobnie powinieneś zignorować Information_schema i mysql, ponieważ „Bazy danych mysql i information_schema, które implementują niektóre wewnętrzne elementy MySQL, nadal używają MyISAM. W szczególności nie można przełączyć tabel grantu na InnoDB”. ( http://dev.mysql.com/doc/refman/5.5/en/innodb-default-se.html )
W każdym razie zwróć uwagę na tabele, które należy zignorować i uruchomić:
SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE engine ='myisam';
Teraz wystarczy skopiować / wkleić tę listę do edytora tekstu i wyszukać / zamienić „|” z „ALTER TABLE” itp.
Będziesz wtedy mieć taką listę, którą możesz po prostu wkleić do terminala mysql:
Jeśli twój edytor tekstu nie może tego łatwo zrobić, oto inne rozwiązanie, aby uzyskać podobną listę (którą można wkleić do mysql) tylko jednego prefiksu bazy danych z terminala linux:
mysql -u [username]-p[password]-B -N -e 'show tables like "arth_%"'[database name]| xargs -I '{}' echo "ALTER TABLE {} ENGINE=INNODB;"
Możesz po prostu uruchomić plik wykonywalny mysql, użyć bazy danych i skopiować i wkleić zapytanie.
Spowoduje to konwersję wszystkich tabel MyISAM w bieżącej bazie danych na tabele 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;
Jestem nowicjuszem i musiałem znaleźć własne rozwiązanie, ponieważ polecenia mysql w Internecie są zazwyczaj pełne błędów pisowni, co stanowi koszmar dla ludzi, którzy dopiero zaczynają. Oto moje rozwiązanie ....
Zamiast 1 polecenia na tabelę, przygotowałem kilkadziesiąt poleceń (gotowych do skopiowania i wklejenia) jednocześnie przy użyciu programu Excel.
W jaki sposób? rozwiń okno kitu i wpisz mysql, a następnie uruchom polecenie „POKAŻ STATUS TABELI”; i skopiuj / wklej dane wyjściowe do programu Microsoft Excel. Przejdź na kartę Dane i użyj funkcji „tekst do kolumn”, aby oddzielić kolumny klawiszem spacji. Następnie posortuj kolumny według dowolnej kolumny, która pokazuje typy tabel i usuń wszystkie wiersze, które tabele są już w formacie InnoDb (ponieważ nie musimy uruchamiać komend przeciwko nim, są już gotowe). Następnie dodaj 2 kolumny po lewej stronie kolumny tabeli i 2 kolumny po prawej stronie. Następnie wklej pierwszą część polecenia w kolumnie 1 (patrz poniżej). Kolumna 2 powinna zawierać tylko spację. Kolumna 3 to kolumna twoich tabel. Kolumna 4 powinna zawierać tylko spację. Kolumna 5 to ostatnia część twojego polecenia. To powinno wyglądać tak:
Następnie skopiuj i wklej około 5 wierszy na raz do mysql. Spowoduje to konwersję około 5 naraz. Zauważyłem, że jeśli zrobię więcej niż to naraz, polecenia się nie powiodą.
<?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);}?>
Jeszcze inna opcja ... Oto jak to zrobić w ansible. Zakłada się, że nazwa Twojej bazy danych jest już dostępna dbnamei że masz już skonfigurowany dostęp.
- 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 }}"
Odpowiedzi:
źródło
mysql_*
Interfejs PHP jest przestarzały i usunięty z wersji 7. Nie używaj tego kodu w obecnej postaci.Uruchom tę instrukcję SQL (w kliencie MySQL, phpMyAdmin lub gdziekolwiek), aby pobrać wszystkie tabele MyISAM w bazie danych.
Zamień wartość
name_of_your_db
zmiennej na nazwę bazy danych.Następnie skopiuj dane wyjściowe i uruchom jako nowe zapytanie SQL.
źródło
ORDER BY table_name DESC
)CONCAT('ALTER TABLE ', table_name, ' ENGINE=InnoDB;')
naCONCAT('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
Działa jak marzenie.
Spowoduje to wyświetlenie listy wszystkich tabel z zapytaniami alter, które można uruchomić w partii
źródło
W poniższych skryptach zastąp <nazwa użytkownika>, <hasło> i <schemat> swoimi konkretnymi danymi.
Aby wyświetlić instrukcje, które można skopiować i wkleić do sesji klienta mysql, wpisz następujące polecenie:
Aby po prostu wykonać zmianę, użyj tego:
KREDYT: Jest to odmiana tego, co zostało przedstawione w tym artykule .
źródło
Jedna linia:
źródło
"$1"
w backticks w ten sposób:`"$1"`
podobnie jak w mojej odpowiedzi.Użyj tego jako zapytania SQL w swoim phpMyAdmin
źródło
Możesz wykonać tę instrukcję w narzędziu wiersza poleceń mysql:
Konieczne może być podanie nazwy użytkownika i hasła za pomocą: mysql -u nazwa użytkownika -p Wynikiem jest skrypt sql, który można przesłać z powrotem do mysql:
Zamień „nazwa-bazy danych” w powyższej instrukcji i wierszu poleceń.
źródło
-bash: ,TABLE_NAME,: command not found
To bardzo proste, jest tylko DWA krok, wystarczy skopiować i wkleić:
krok 1.
(skopiuj i wklej wszystkie wyniki w zakładce sql)
krok 2: (skopiuj wszystkie wyniki w zakładce sql) i wklej poniżej w linii
ROZPOCZNIJ TRANSAKCJĘ;
POPEŁNIĆ;
na przykład. ROZPOCZNIJ TRANSAKCJĘ;
ZMIEŃ
admin_files
SILNIK TABELI = InnoDB;POPEŁNIĆ;
źródło
Aby wygenerować instrukcje ALTER dla wszystkich tabel we wszystkich schematach niesystemowych, uporządkowane według tych schematów / tabel, wykonaj następujące czynności:
Następnie uruchom te zapytania za pośrednictwem klienta, aby wykonać zmianę.
źródło
Nie zostało jeszcze wspomniane, więc napiszę to dla potomności:
Jeśli przeprowadzasz migrację między serwerami DB (lub masz inny powód, dla którego zrzucisz i przeładujesz dta), możesz po prostu zmodyfikować dane wyjściowe z
mysqldump
:Następnie załaduj go ponownie:
(Ponadto, według mojego ograniczonego doświadczenia, może to być znacznie szybszy proces niż zmiana tabel „na żywo”. Prawdopodobnie zależy to od rodzaju danych i indeksów.)
źródło
Oto sposób, aby to zrobić dla użytkowników Django:
Dodaj to do swojej aplikacji w folderze zarządzanie / komendy / Następnie możesz przekonwertować wszystkie tabele za pomocą komendy manage.py:
źródło
Z poziomu mysql możesz użyć funkcji wyszukiwania / zamiany za pomocą edytora tekstu:
Uwaga: Prawdopodobnie powinieneś zignorować Information_schema i mysql, ponieważ „Bazy danych mysql i information_schema, które implementują niektóre wewnętrzne elementy MySQL, nadal używają MyISAM. W szczególności nie można przełączyć tabel grantu na InnoDB”. ( http://dev.mysql.com/doc/refman/5.5/en/innodb-default-se.html )
W każdym razie zwróć uwagę na tabele, które należy zignorować i uruchomić:
Teraz wystarczy skopiować / wkleić tę listę do edytora tekstu i wyszukać / zamienić „|” z „ALTER TABLE” itp.
Będziesz wtedy mieć taką listę, którą możesz po prostu wkleić do terminala mysql:
Jeśli twój edytor tekstu nie może tego łatwo zrobić, oto inne rozwiązanie, aby uzyskać podobną listę (którą można wkleić do mysql) tylko jednego prefiksu bazy danych z terminala linux:
źródło
Prosta wersja MySQL.
Możesz po prostu uruchomić plik wykonywalny mysql, użyć bazy danych i skopiować i wkleić zapytanie.
Spowoduje to konwersję wszystkich tabel MyISAM w bieżącej bazie danych na tabele INNODB.
źródło
użyj tego wiersza, aby zmienić silnik bazy danych dla pojedynczej tabeli.
źródło
Jestem nowicjuszem i musiałem znaleźć własne rozwiązanie, ponieważ polecenia mysql w Internecie są zazwyczaj pełne błędów pisowni, co stanowi koszmar dla ludzi, którzy dopiero zaczynają. Oto moje rozwiązanie ....
Zamiast 1 polecenia na tabelę, przygotowałem kilkadziesiąt poleceń (gotowych do skopiowania i wklejenia) jednocześnie przy użyciu programu Excel.
W jaki sposób? rozwiń okno kitu i wpisz mysql, a następnie uruchom polecenie „POKAŻ STATUS TABELI”; i skopiuj / wklej dane wyjściowe do programu Microsoft Excel. Przejdź na kartę Dane i użyj funkcji „tekst do kolumn”, aby oddzielić kolumny klawiszem spacji. Następnie posortuj kolumny według dowolnej kolumny, która pokazuje typy tabel i usuń wszystkie wiersze, które tabele są już w formacie InnoDb (ponieważ nie musimy uruchamiać komend przeciwko nim, są już gotowe). Następnie dodaj 2 kolumny po lewej stronie kolumny tabeli i 2 kolumny po prawej stronie. Następnie wklej pierwszą część polecenia w kolumnie 1 (patrz poniżej). Kolumna 2 powinna zawierać tylko spację. Kolumna 3 to kolumna twoich tabel. Kolumna 4 powinna zawierać tylko spację. Kolumna 5 to ostatnia część twojego polecenia. To powinno wyglądać tak:
Następnie skopiuj i wklej około 5 wierszy na raz do mysql. Spowoduje to konwersję około 5 naraz. Zauważyłem, że jeśli zrobię więcej niż to naraz, polecenia się nie powiodą.
źródło
W moim przypadku migrowałem z instancji MySQL z domyślną wersją MyISAM do instancji MariaDB z DOMYŚLNĄ InnoDB.
Dokumenty migracyjne według MariaDB.
Na starym serwerze Uruchom:
--Skip-create-options zapewnia, że serwer bazy danych używa domyślnego silnika pamięci podczas ładowania danych, zamiast MyISAM.
To spowodowało błąd podczas tworzenia mysql.db, ale teraz wszystko działa świetnie :)
źródło
Właśnie przetestowałem inny (prosty?) Sposób i działałem dla mnie.
Wystarczy wyeksportować plik DB jako plik .sql, edytować go za pomocą gedit lub notatnika;
Wymień
ENGINE=MyISAM
sięENGINE=INNODB
i zapisz plik edytowanyLiczba lub dokonana wymiana powinna być liczbą twoich tabel
Zaimportuj go do MySQL (phpMyAdmin lub wiersz poleceń)
I Voila!
źródło
Możesz napisać skrypt, aby zrobić to w swoim ulubionym języku skryptowym. Skrypt wykonałby następujące czynności:
SHOW FULL TABLES
.'BASE TABLE'
a nie'VIEW'
.'VIEW'
, wydaj odpowiednieALTER TABLE
polecenie.źródło
Wypróbuj ten skrypt powłoki
źródło
Niektóre poprawki tego skryptu użytkownika
źródło
źródło
To jest prosty skrypt php.
źródło
źródło
dla mysqli connect;
źródło
Jeszcze inna opcja ... Oto jak to zrobić w ansible. Zakłada się, że nazwa Twojej bazy danych jest już dostępna
dbname
i że masz już skonfigurowany dostęp.źródło
cd / var / lib / mysql / DBNAME
ls | grep ".frm" | cut -d "." -f1 | xargs -I {} -n1 mysql -D DBNAME -e "zmień tabelę {} ENGINE = INNODB;" -uroot -pXXXXX
źródło