MyISAM의 모든 테이블을 InnoDB로 변환하는 방법은 무엇입니까?


264

테이블 스토리지를 MyISAM에서 InnoDB로 변경하기 위해 개별적으로 alter table을 발행 할 수 있다는 것을 알고 있습니다.

모든 것을 InnoDB로 빠르게 변경할 수있는 방법이 있는지 궁금합니다.


1
변환 .
Rick James

답변:


173
<?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);
    }
?>

5
초점을 맞추고있는 데이터베이스로 제한하는 것이 좋습니다. "AND TABLE_SCHEMA = 'dbname'을 추가하십시오. 그렇지 않으면 모든 인터넷 MySQL 테이블도 innodb로 변경할 수 있습니다 (일부는 메모리 여야 함)
Noodles

7
PHP의 mysql_*인터페이스는 더 이상 사용되지 않으며 버전 7에서 제거되었습니다.이 코드를 그대로 사용하지 마십시오.
Rick James

4
@GajendraBang-그렇습니다. 제시된 답변은 유효합니다. 그러나 이민자에게는 더 이상 유효하지 않습니다. 내 의도는 그대로 사용하는 것에 대해 경고하는 것이 었습니다 .
Rick James

1
이 질문은 PHP를 언급하지 않습니다
phil294

1
가장 최근의 수정 사항은 어떻게 표시되지 않습니까? MySQL 부분은 Will Jones의 답변을 직접 복사 한 것입니다. 각 편집 기록을보고이 답변이 2019 년에 나타난 동안 Will의 답변이 2013 년에 나타났음을 알 수 있습니다. 결과적으로이 질문의 무결성이 손상됩니다.
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'
ORDER BY table_name DESC;

그런 다음 출력을 복사하고 새 SQL 쿼리로 실행하십시오.


4
잘 작동했습니다! 여기에 예제 쉘 스크립트를 넣었습니다. shrubbery.mynetgear.net/c/display/W/…
Joshua Davis

4
나는이 오류를 받고 있어요 "데이터 정렬 # 1267 불법 혼합 ...", 그것은 작동하지 않습니다
Rápli 안드라스

1
호기심에서 명시 적 내림차순의 요점은 무엇입니까? ( ORDER BY table_name DESC)
rinogo

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 manchu

61
SELECT CONCAT('ALTER TABLE ',TABLE_NAME,' ENGINE=InnoDB;') 
FROM INFORMATION_SCHEMA.TABLES
WHERE ENGINE='MyISAM'
AND table_schema = 'mydatabase';

매력처럼 작동합니다.

일괄 처리로 실행할 수있는 대체 쿼리가있는 모든 테이블 목록이 제공됩니다.


5
이를 실행 한 후에는 먼저 다음 쿼리를 실행해야합니다. USE databasename; 그런 다음 위 스크립트에서 제공하는 쿼리를 사용할 수 있습니다.
gijs007

배치를 어떻게 실행합니까?
Marc Alexander

위의 쿼리는 테이블 쿼리를 변경합니다. 모두 선택하고 함께 실행하면됩니다. 또는 50 개의 쿼리 그룹으로 나누고 결과 집합에 테이블이 너무 많은 경우 실행
Omkar Kulkarni

2
2018 및 Percona Cluster에서도 작동합니다. PHPMyAdmin에서 사용하는 경우 20 개 정도의 이름과 "..."또는 페이지 매김 >> 기호 만 표시됩니다. 즉, 다음 페이지를 모두 클릭하여 계속 복사해야하므로 테이블을 놓치지 않아도됩니다. 잊어 버린 경우 위 쿼리를 안전하게 다시 적용하면 다음 MyISAM 테이블을 변환 할 수 있습니다.
다리오 푸마 갈리

23

아래 스크립트에서 <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>

신용 : 이것은 이 기사 에 요약 된 내용의 변형입니다 .


23

한 줄:

 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
최고와 가장 지능적인 답변!
biniam

이것을 bash 스크립트에서 실행할 때 $ 1을 NR 정의를 덮어 쓰는 bash 스크립트 변수로 해석합니다. 이 주위에 어떤 방법이 있습니까?
생활

@WorksforaLiving은 "$1"다음 `"$1"`과 같이 백틱을 묶습니다 . 내 답변과 비슷합니다.
Vijay Varadan

20

이것을 phpMyAdmin에서 SQL 쿼리로 사용하십시오.

SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' engine=InnoDB;') 
FROM information_schema.tables 
WHERE engine = 'MyISAM';

3
이것은 실제로 테이블을 InnoDB로 변환하지 않는 것 같습니다.
Charlie Schliesser

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 결과는 mysql로 ​​다시 파이프 할 수있는 SQL 스크립트입니다.

mysql name-of-database < convert.sql

위의 명령문과 명령 행에서 "데이터베이스 이름"을 바꾸십시오.


@itsraja, "echo"는 linux / unix의 sh와 Microsoft 시스템의 cmd 모두에서 지원되는 명령이며, 결과는 mysql 도구에 입력으로 파이프됩니다.
Hendrik Brummermann

2
맞습니다. 그러나 "MySQL의 명령 줄 도구"로 언급 u've
itsraja에게

1
또한 echo "SELECT concat (concat ( 'ALTER TRABLE', TABLE_NAME), 'ENGINE = InnoDB;') 엔진이있는 곳에서 테이블! = 'InnoDB'AND TABLE_TYPE = 'BASE TABLE'AND TABLE_SCHEMA = 'testinno'"| mysql -u root --sock = / opt / lampp / var / mysql / mysql.sock --database = testinno> convert.sql 1 : 라인 1의 ERROR 1146 (42S02) 테이블 'testinno.TABLES'가 존재하지 않습니다
itsraja

여기에 예제 쉘 스크립트를 넣었습니다. shrubbery.mynetgear.net/c/display/W/…
Joshua Davis

1
어떻게 SQL 문을 문자열로 올바르게 이스케이프 할 수 있습니까? 지금처럼, 나는-bash: ,TABLE_NAME,: command not found
arjan

10

두 단계 만 복사하여 붙여 넣기가 매우 간단합니다.

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_filesENGINE = 이노 DB;

범하다;


10

모든 비 시스템 스키마의 모든 테이블에 대해 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;

그런 다음 클라이언트를 통해 해당 쿼리를 실행하여 변경을 수행하십시오.

  • 답변은 위의 답변을 기반으로하지만 스키마 처리를 향상시킵니다.

8

아직 언급되지 않았으므로 후손을 위해 쓸 것입니다.

DB 서버간에 마이그레이션하는 경우 (또는 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

(제 제한된 경험에서 이것은 테이블을 '실시간'으로 변경하는 것보다 훨씬 빠른 프로세스 일 수 있습니다. 데이터 및 인덱스 유형에 따라 다를 수 있습니다.)


타이! 정확히 내가 찾던 것. 며칠 후에 테스트합니다.
Rainer

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");

        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

폴더 관리 / 명령 / 아래에 앱에 추가 한 다음 manage.py 명령으로 모든 테이블을 변환 할 수 있습니다.

python manage.py convert_to_innodb

5

mysql 내부에서 텍스트 편집기를 사용하여 검색 / 바꾸기를 사용할 수 있습니다.

SELECT table_schema, table_name FROM INFORMATION_SCHEMA.TABLES WHERE engine = 'myisam';

참고 : "MySQL 내부를 구현하는 mysql 및 information_schema 데이터베이스는 여전히 MyISAM을 사용합니다. 특히 InnoDB를 사용하도록 grant 테이블을 전환 할 수 없기 때문에 information_schema 및 mysql을 무시해야합니다." ( 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 터미널에 간단히 붙여 넣을 수있는 다음과 같은 목록이 표시됩니다.

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;

텍스트 편집기로이를 쉽게 수행 할 수없는 경우 다음은 Linux 터미널에서 데이터베이스의 접두사 하나에 대해 유사한 목록 (mysql에 붙여 넣기 가능)을 가져 오는 또 다른 솔루션입니다.

mysql -u [username] -p[password] -B -N -e 'show tables like "arth_%"' [database name] | xargs -I '{}' echo "ALTER TABLE {} ENGINE=INNODB;"

5

평범한 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;

저장 프로 시저 기반 솔루션이 더 이상 없다는 것에 놀랐습니다!
FrustratedWithFormsDesigner

MySQL에서 작성 및 테스트 절차는 고통스럽기 때문에 ;-) 의견은 질문과 관련이 없습니다.
Harald Leithner

3

이 행을 사용하여 단일 테이블의 데이터베이스 엔진을 변경하십시오.

  ALTER TABLE table_name ENGINE = INNODB;

3

나는 초보자이며 웹에서 mysql 명령은 일반적으로 철자가 틀리기 때문에 사람들이 실제로 악몽을 느끼기 때문에 자신의 솔루션을 찾아야했습니다. 여기 내 해결책이 있습니다 ....

테이블 당 1 개의 명령 대신 Excel을 사용하여 한 번에 수십 개의 명령 (복사 및 붙여 넣기 준비)을 준비했습니다.

어떻게? 퍼티 창을 확장하고 mysql을 입력 한 다음 "SHOW TABLE STATUS;"명령을 실행하십시오. 출력을 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로 변환됩니다. 한 번에 그 이상을 수행하면 명령이 실패합니다.


3

필자의 경우 기본 MyISAM 인 MySQL 인스턴스에서 DEFAULT가 InnoDB 인 MariaDB 인스턴스로 마이그레이션했습니다.

MariaDB 마이그레이션 문서 별.

이전 서버 실행에서 :

mysqldump -u root -p --skip-create-options --all-databases > migration.sql

--skip-create-options는 데이터베이스 서버가 MyISAM 대신 데이터를로드 할 때 기본 스토리지 엔진을 사용하도록합니다.

mysql -u root -p < migration.sql

이것은 mysql.db 생성과 관련된 오류를 발생 시켰지만 모든 것이 잘 작동합니다.


3

다른 (간단한?) 방법을 테스트하고 나를 위해 일했습니다.

DB를 .sql 파일로 내보내고 gedit 또는 notepad로 편집하십시오.

교체 ENGINE=MyISAMENGINE=INNODB파일 저장 편집

테이블 수 또는 교체 횟수

MySQL로 가져 오기 (phpMyAdmin 또는 명령 행)

그리고 짜잔!


2

선호하는 스크립팅 언어로 스크립트를 작성할 수 있습니다. 스크립트는 다음을 수행합니다.

  1. 문제 SHOW FULL TABLES.
  2. 반환 된 각 행에 대해, 두 번째 열에는 말한다 확인 'BASE TABLE'하지 'VIEW'.
  3. 그렇지 않은 경우 'VIEW'적절한 ALTER TABLE명령을 실행하십시오.

2

이 쉘 스크립트를 사용해보십시오

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

2

이 유틸리티 스크립트의 일부 수정

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;

1
<?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");
    }
  }

1

이것은 간단한 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>';
    }

1
<?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();

?>

1

mysqli 연결을 위해;

<?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);
} ?>

0

또 다른 옵션은 다음과 같습니다. 데이터베이스 이름이 있고 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 }}"

-1

cd / var / lib / mysql / DBNAME

LS | grep ".frm"| 컷 -d "." -f1 | xargs -I {} -n1 mysql -D DBNAME -e "변경 테이블 {} ENGINE = INNODB;" -uroot -pXXXXX

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.