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
다른 사람이 간단한 작업을 수행하는 데 도움이되기를 바랍니다.