MySQL에서 권한을 내 보낸 다음 새 서버로 가져 오려면 어떻게해야합니까? 새로운 데이터베이스에 기존

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

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

기존 서버 : 5.0.67-community

새 서버 : 5.0.51a-24 + lenny1

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

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

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



답변

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

mygrants()
{
  mysql -B -N $@ -e "SELECT DISTINCT CONCAT(
    'SHOW GRANTS FOR \'', user, '\'@\'', host, '\';'
    ) AS query FROM mysql.user" | \
  mysql $@ | \
  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로 수정되었습니다.


답변

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

시도 해봐 !!!


답변

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

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

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


답변

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


답변

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

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


답변

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

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 명령을 통해 출력을 파이프하십시오.


답변

@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

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