programing

MyISAM의 모든 테이블을 InnoDB로 변환하려면 어떻게 해야 합니까?

firstcheck 2022. 11. 7. 22:02
반응형

MyISAM의 모든 테이블을 InnoDB로 변환하려면 어떻게 해야 합니까?

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

모두 InnoDB로 빨리 변경할 수 있는 방법이 없을까요?

데이터베이스 내의 모든 MyISAM 테이블을 가져오려면 이 SQL 문을 실행합니다(MySQL 클라이언트, phpMyAdmin 등).

의값 of of of of of of of of 의 값을 .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 쿼리로 실행합니다.

<?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);
    }
?>
SELECT CONCAT('ALTER TABLE ',TABLE_NAME,' ENGINE=InnoDB;') 
FROM INFORMATION_SCHEMA.TABLES
WHERE ENGINE='MyISAM'
AND table_schema = 'mydatabase';

마법처럼 작동한다.

그러면 일괄적으로 실행할 수 있는 변경 쿼리가 있는 모든 테이블 목록이 표시됩니다.

한 줄:

 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

다음 스크립트에서는 <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>

크레딧: 이것은 이 기사에서 개략적으로 설명한 내용을 변형한 것입니다.

phpMyAdmin에서 SQL 쿼리로 사용

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 를 사용하여 사용자 이름과 비밀번호를 지정해야 할 수 있습니다.그 결과 mysql 에 파이프백할 수 있는Sql 스크립트가 생성됩니다.

mysql name-of-database < convert.sql

위의 문과 명령줄에서 "데이터베이스 이름"을 바꿉니다.

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

그런 다음 클라이언트를 통해 쿼리를 실행하여 변경을 수행합니다.

  • 답변은 위의 답변에 기초하지만 스키마 처리가 향상됩니다.

아주 간단해요.스텝은 2개뿐입니다.

  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 탭에 붙여넣기)

  1. 모든 결과를 SQL 탭에 복사하고 아래 줄에 붙여넣습니다.

    START TRANSACTION;
    COMMIT;
    

예를 들어 다음과 같습니다.

START TRANSACTION;
ALTER TABLE `admin_files` ENGINE=InnoDB;
COMMIT;

아직 언급되지 않았기 때문에 후세를 위해 쓰겠습니다.

서버 dta를 및 경우 DB의 수(「dta」 「dta」 「dta」 「dta」 「dta」 「dta」 「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

폴더 관리/명령어 아래 앱에 추가/ 그러면 관리 기능으로 모든 테이블을 변환할 수 있습니다.py 명령:

python manage.py convert_to_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;

다른 방법(심플?)을 시험해 보고, 나를 위해 일했습니다.

DB를 .sql 파일로 내보내고 편집 또는 메모장으로 편집합니다.

ENGINE=MyISAMENGINE=INNODB한 파일을 합니다.

완료된 번호 또는 교체는 테이블의 번호여야 합니다.

MySQL로 Import(phpMyAdmin 또는 명령줄)

그리고 Voila!

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

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

주의: information_schema 및 mysql은 무시해야 합니다.MySQL 내부 구현의 mysql 및 information_schema 데이터베이스는 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 터미널에 붙여넣기만 하면 다음과 같은 목록이 나타납니다.

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

이 행을 사용하여 단일 테이블의 데이터베이스 엔진을 변경합니다.

  ALTER TABLE table_name ENGINE = INNODB;

웹상의 mysql 명령어는 보통 철자가 틀리기 때문에 저는 초보자이기 때문에 저만의 해결책을 찾아야 했습니다.여기 제 해결책이 있습니다.

테이블당 1개의 명령어가 아닌 엑셀을 사용하여 수십 개의 명령어(복사 및 붙여넣기 가능)를 한꺼번에 준비했습니다.

어떻게? 퍼티창을 펼치고 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개 정도 변환됩니다.한 번에 그 이상을 하면 명령어가 실패한다는 것을 깨달았습니다.

내 경우 MyISAM 기본 MySQL 인스턴스에서 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 작성에 관한 오류가 발생했지만 현재는 정상적으로 동작하고 있습니다.

좋아하는 스크립트 언어로 스크립트를 작성할 수 있습니다.스크립트는 다음 작업을 수행합니다.

  1. ★★★SHOW FULL TABLES.
  2. 반환되는 각 두 에 "이렇게 하면 안 돼요"라고 되어 있는지 합니다.'BASE TABLE' and'VIEW'.
  3. 가 아닌 경우'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 스크립트입니다.

<?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 접속용;

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

다음의 순서에 따릅니다.

  1. 는 InnoDB InnoDB로 변환하기 같이 합니다.(ALTER TABLE t1 ENGINE = InnoDB) ★★★★★★★★★★★★★★★★★」(ALTER TABLE t1 ENGINE = MyISAM)MyISAM의 경우(이 작업은 각 테이블에 대해 수행해야 합니다.t1은 테이블 이름용입니다).

  2. 모든 테이블에서 루프를 실행하는 스크립트를 작성하고 alter 명령을 실행합니다.

  3. 이미 사용 가능한 스크립트를 사용하여 처리하십시오.https://github.com/rafihaidari/convert-mysql-tables-storage-engine

  4. 이 SQL을 사용하여 모든 테이블 정보를 가져오면 모든 테이블을 isam에서 InnoDB로 변경할 수 있습니다.

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

또 다른 선택지는...이렇게 하는 겁니다.이 "Database"에 합니다.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 }}"

MySql 테이블 스토리지 엔진을 변환하는 방법은 다음과 같습니다.

  1. MySql 명음음음odododododododododododododododododododododododododododododod use use use use use use use use use)로 변환합니다.ALTER TABLE t1 ENGINE = InnoDB 또는 (예:ALTER TABLE t1 ENGINE = MyISAM입니다).myisam은 테이블 이름용입니다.myisam은 테이블 이름용입니다.
  2. 모든 테이블에서 루프하는 스크립트를 작성하고 alter 명령을 실행합니다.
  3. 이미 사용 가능한 스크립트를 사용하여 처리하십시오.https://github.com/rafihaidari/convert-mysql-tables-storage-engine

Windows 를 사용하고 있는 경우는, 다음의 루프를 가지는 배치 파일내에서 이것을 실행할 수 있습니다.

set database=YOURDATABASENAME
for /F "tokens=1 skip=1 usebackq" %%a in (`mysql %%database%% -e "show table status where Engine != 'InnoDB';"`) do (
    mysql %database% -e "ALTER TABLE %%a ENGINE = 'InnoDB';"
)

'만나면 돼요.YOURDATABASENAME으로 하는 하거나 를 사용합니다.%~1명령줄을 통해 데이터베이스 이름을 전달합니다.

현재 존재하지 않는 모든 테이블InooDB로 변환됩니다.InnoDB특정 타깃을 설정하고 싶은 경우MyISAM질문에서 제시된 바와 같이, 다음 코드는 오직 다음만을 위해 업데이트된 MySQL 조건을 가지고 있습니다.MyISAM.

set database=YOURDATABASENAME
for /F "tokens=1 skip=1 usebackq" %%a in (`mysql %%database%% -e "show table status where Engine = 'MyISAM';"`) do (
    mysql %database% -e "ALTER TABLE %%a ENGINE = 'InnoDB';"
)

데이터베이스의 SQL 덤프 파일(database_dump.sql)을 생성하여 메모장에서 엽니다.모든 "ENGINE=MyISAM"을 "ENGINE=InnoDB"로 찾아 교체합니다.파일을 저장한 후 데이터베이스로 다시 가져옵니다.

cd /var/lib/mysql/DBNAME

ls | grep ".frm" | cut - d." - f1 | xargs - I{} - n1 mysql - D DBNAME - e " table table { } ENGINE = INNODB ; " - uroot - pXXXXX

언급URL : https://stackoverflow.com/questions/3856435/how-to-convert-all-tables-from-myisam-into-innodb

반응형