it-swarm-ko.tech

MySQL에서 권한을 내 보낸 다음 새 서버로 가져 오려면 어떻게해야합니까?

Mysqldump를 사용하여 데이터베이스를 내보내거나 가져 오는 방법을 알고 있으며 새 서버에 대한 권한을 얻는 방법은 무엇입니까?.

추가 포인트의 경우 이미 새로운 데이터베이스에 기존 데이터베이스가 몇 개 있습니다. 기존 데이터베이스를 두 번 사용하지 않고 기존 서버 권한을 가져 오는 방법은 무엇입니까?.

기존 서버 : 5.0.67-community

새 서버 : 5.0.51a-24 + lenny1

편집 : 이전 서버에서 db 'mysql'덤프를 가져 왔으며 이제 새 서버에서 'mysql'db와 병합하는 올바른 방법을 알고 싶습니다.

PhpMyAdmin을 사용하여 직선 '가져 오기'를 시도한 결과 복제본 (이미 수동으로 마이그레이션 한 것)에 관한 오류가 발생했습니다.

누구나 두 개의 'mysql'데이터베이스를 병합하는 우아한 방법을 가지고 있습니까?

90
Gareth

Mysql DB를 망쳐 놓지 마십시오. users 테이블보다 훨씬 더 많은 일이 있습니다. 최선의 방법은 " SHOW GRANTS FOR"명령입니다. 내 .bashrc (실제로 내 .bashrc에서 제공하는 .bash_aliases)에는 많은 CLI 유지 관리 별칭과 함수가 있습니다. 이 기능 :

mygrants()
{
  mysql -B -N [email protected] -e "SELECT DISTINCT CONCAT(
    'SHOW GRANTS FOR \'', user, '\'@\'', Host, '\';'
    ) AS query FROM mysql.user" | \
  mysql [email protected] | \
  sed 's/\(GRANT .*\)/\1;/;s/^\(Grants for .*\)/## \1 ##/;/##/{x;p;x;}'
}

첫 번째 mysql 명령은 SQL을 사용하여 두 번째 mysql 명령으로 파이프되는 유효한 SQL을 생성합니다. 그런 다음 출력은 sed를 통해 파이프되어 예쁜 주석을 추가합니다.

명령의 $ @를 사용하면 다음과 같이 호출 할 수 있습니다. mygrants --Host = prod-db1 --user = admin --password = secret

다음과 같이 전체 유닉스 툴킷을 사용할 수 있습니다.

mygrants --Host=prod-db1 --user=admin --password=secret | grep Rails_admin | mysql --Host=staging-db1 --user=admin --password=secret

이것이 사용자를 이동시키는 올바른 방법입니다. MySQL ACL은 순수 SQL로 수정되었습니다.

171
Bruno Bronosky

MySQL 인스턴스에서 SQL Grants를 추출하는 방법에는 두 가지가 있습니다

방법 # 1

Percona Toolkit에서 pt-show-grants 를 사용할 수 있습니다

MYSQL_CONN="-uroot -ppassword"
pt-show-grants ${MYSQL_CONN} > MySQLUserGrants.sql

방법 # 2

pt-show-grants 다음과 함께

MYSQL_CONN="-uroot -ppassword"
mysql ${MYSQL_CONN} --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',Host,''';') FROM mysql.user WHERE user<>''" | mysql ${MYSQL_CONN} --skip-column-names -A | sed 's/$/;/g' > MySQLUserGrants.sql

두 방법 모두 MySQL 보조금의 순수 SQL 덤프를 생성합니다. 새 서버에서 스크립트를 실행하기 만하면됩니다.

mysql -uroot -p -A < MySQLUserGrants.sql

시도 해봐 !!!

48
RolandoMySQLDBA

Richard Bronosky의 답변은 매우 유용했습니다. 많은 감사합니다 !!!

여기에 유용한 작은 변형이 있습니다. 예를 들어 사용자를 전송하는 데 도움이됩니다. phpmyadmin을 실행하는 두 개의 우분투 설치 사이. root, phpmyadmin 및 debian-sys-maint를 제외한 모든 사용자에게 권한을 덤프하십시오. 그런 다음 코드는

mygrants()
{
mysql -B -N [email protected] -e "SELECT DISTINCT CONCAT(
'SHOW GRANTS FOR ''', user, '''@''', Host, ''';'
) AS query FROM mysql.user WHERE user NOT IN ('root','phpmyadmin','debian-sys-maint')"  | \
mysql [email protected] | \
sed 's/\(GRANT .*\)/\1;/;s/^\(Grants for .*\)/## \1 ##/;/##/{x;p;x;}'
}
15
rmldj

또는 percona-toolkit (이전 maatkit)을 사용하고 pt-show-grants (또는 mk-show-grants) 그 목적을 위해. 번거로운 스크립트 및/또는 저장 프로 시저가 필요하지 않습니다.

7
MrkiMile

'mysql'데이터베이스를 mysqldump하고 새 데이터베이스로 가져올 수 있습니다. flush_privileges 또는 재시작이 필요하며 기존 mysq db를 먼저 백업해야합니다.

기존 권한을 제거하지 않으려면 권한 테이블의 행 (db, columns_priv, Host, func 등)을 바꾸지 말고 추가하십시오.

5
nedm

PHP 스크립트는 어떻습니까? :)

이 스크립트에서 소스를 보면 모든 권한이 나열됩니다.

//connect
mysql_select_db("mysql", mysql_connect("localhost","root",""));

//create grants select statements
$rs = mysql_query("SELECT DISTINCT CONCAT('SHOW GRANTS FOR ''', user, '''@''', Host, ''';') AS query FROM user");

//iterate through grants
while ($row=mysql_fetch_array($rs)) {
    //run grant query
    $rs2 = mysql_query($row['query']);
    //iterate through results
    while($row2 = mysql_fetch_array($rs2)){
        //print results
        echo $row2[0] . ";\n\n";
    }
}
4
Ibrahim Lawal

저장 프로 시저로 수행 할 수도 있습니다.

CREATE PROCEDURE spShowGrants()
    READS SQL DATA
    COMMENT 'Show GRANT statements for users'
BEGIN
    DECLARE v VARCHAR(64) CHARACTER SET utf8;
    DECLARE c CURSOR FOR
    SELECT DISTINCT CONCAT(
        'SHOW GRANTS FOR ', user, '@', Host, ';'
    ) AS query FROM mysql.user;
    DECLARE EXIT HANDLER FOR NOT FOUND BEGIN END;  
    OPEN c;
    WHILE TRUE DO
        FETCH c INTO v;
        SET @v = v;
        PREPARE stmt FROM @v;
        EXECUTE stmt;
    END WHILE;
    CLOSE c;
END

그리고 그것을 호출

$ mysql -p -e "CALL spShowGrants" mysql

그런 다음 Richards sed 명령을 통해 출력을 파이프하여 권한의 백업을 확보하십시오.

4
Lenny

@Richard Bronosky의 대답이 정답이지만, 한 서버에서 다른 서버로 데이터베이스 세트를 마이그레이션하려고 시도한 후이 질문에 부딪 쳤으며 솔루션은 훨씬 간단했습니다.

server1$ mysqldump -u root -p --all-databases > dbdump.sql

server2$ mysql -u root -p < dbdump.sql

이 시점에서 root (으)로 로그인하면 모든 데이터가 표시됩니다. mysql.user 테이블에 필요한 모든 정보가 있지만 다른 사용자로 로그인 할 수 없었습니다. GRANT 문을 다시 발행해야한다는 가정하에이 질문을 발견했습니다.

그러나 mysql.* 테이블의 업데이트 된 권한을 적용하려면 mysql 서버를 다시 시작해야했습니다.

server2$ Sudo restart mysql

다른 사람이 간단한 작업을 수행하는 데 도움이되기를 바랍니다.

3
Tom

다음 코드를 사용하여 셸 스크립트 파일을 만듭니다.

echo "SELECT DISTINCT CONCAT (\"show grants for '\", user, \"'@'\", Host, \"';\") AS query FROM mysql.user; " >   script.sql    
echo "*** You will be asked to enter the root password twice ******"    
mysql -u root -p  < script.sql > output.sql ;    
cat output.sql | grep show > output1.sql  ; rm output.sql -f ; 
mysql -u root -p  < output1.sql > output.sql ;
clear
echo "-----Exported Grants-----"    
cat  output.sql ; rm  output.sql   output1.sql -f    
echo "-------------------------"
rm  script.sql -f

**** 그런 다음 셸에서 다음과 같이 실행하십시오. 루트 암호를 두 번 입력하라는 메시지가 표시되면 GRANTS SQL이 화면에 표시됩니다. ****

2
Rony

하나의 라이너는 멋진 pt-show-grants와 거의 동일합니다.

mysql --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',Host,''';') FROM mysql.user WHERE user<>''" | mysql --skip-column-names -A | sed 's/$/;/g'

유닉스 도구만을 기반으로하며 추가 소프트웨어가 필요하지 않습니다.

Bash 쉘 내에서 실행하십시오. .my.cnf 사용자의 비밀번호를 읽을 수있는 mysql root 작업이 있다고 가정합니다.

0
sjas