How to Export & Import Existing User (with its Privileges!)

后端 未结 9 1977
爱一瞬间的悲伤
爱一瞬间的悲伤 2021-02-03 17:01

I have an existing MySQL instance (test), containing 2 databases and a few users each having different access privileges to each database.

I now need to duplicate one of

相关标签:
9条回答
  • 2021-02-03 17:32

    One of the easiest ways I've found to export users is using Percona's tool pt-show-grants. The Percona tool kit is free, easy to install, and easy to use, with lots of documentation. It's an easy way to show all users, or specific users. It lists all of their grants and outputs in SQL format. I'll give an example of how I would show all grants for test_user:

    shell> pt-show-grants --only test_user
    

    Example output of that command:

    GRANT USAGE ON *.* TO 'test_user'@'%' IDENTIFIED BY PASSWORD '*06406C868B12689643D7E55E8EB2FE82B4A6F5F4';
    GRANT ALTER, INSERT, LOCK TABLES, SELECT, UPDATE ON `test`.* TO 'test_user'@'%';
    

    I usually rederict the output into a file so I can edit what I need, or load it into mysql.

    Alternatively, if you don't want to use the Percona tool and want to do a dump of all users, you could use mysqldump in this fashion:

    shell> mysqldump mysql --tables user db > users.sql
    

    Note: --flush-privileges won't work with this, as the entire db isn't being dumped. this means you need to run it manually.

    shell> mysql -e "FLUSH PRIVILEGES"
    
    0 讨论(0)
  • 2021-02-03 17:34

    Here's what I'm using these days as part of my daily backup scripts (requires root shell and MySQL access, linux shell, and uses the mysql built-in schema:

    First, I create a file /var/backup/mysqlroot.cnf containing the root password so I can automate my scripts and not hardcode any passwords in them:

    [client]
    password=(put your password here)
    

    Then I create an export script which dumps create user commands and grants like this:

    touch /var/backup/backup_sql.sh
    chmod 700 /var/backup/backup_sql.sh
    vi /var/backup/backup_sql.sh
    

    And then write the following contents:

    #!/bin/bash
    
    mysql --defaults-extra-file=/var/backup/mysqlroot.cnf -sNe " \
      SELECT \
        CONCAT( 'CREATE USER \'', User, '\'@\'', Host, '\' IDENTIFIED BY \'', authentication_string, '\'\;' ) AS User \
      FROM mysql.user \
      WHERE \
        User NOT LIKE 'mysql.%' AND CONCAT( User, Host ) <> 'rootlocalhost' AND User <> 'debian-sys-maint' \
    "
    
    mysql --defaults-extra-file=/var/backup/mysqlroot.cnf -sNe " \
      SELECT \
        CONCAT( '\'', User, '\'@\'', Host, '\'' ) as User FROM mysql.user \
      WHERE \
        User NOT LIKE 'mysql.%' \
        AND CONCAT( User, Host ) <> 'rootlocalhost' \
        AND User <> 'debian-sys-maint' \
    " | sort | while read u ; 
     do echo "-- $u"; mysql --defaults-extra-file=/var/backup/mysqlroot.cnf -sNe "show grants for $u" | sed 's/$/;/'
    done
    

    Then I just have to run it like this: /var/backup/backup_sql.sh > /tmp/exportusers.sql

    0 讨论(0)
  • 2021-02-03 17:34

    In complement of @Sergey-Podushkin 's answer, this shell script code is workin for me:

    mysql -u<user> -p<password> -N mysql -e "select concat(\"'\", user, \"'@'\", host, \"'\"), authentication_string from user where not user like 'root'" | while read usr pw ; do mysql -u<user> -p<password> -N -e "SHOW GRANTS FOR $usr" | sed 's/\(\S\)$/\1;/'; done 
    
    0 讨论(0)
  • 2021-02-03 17:35
    mysql -u<user> -p<password> -h<host> -e"select concat('show grants for ','\'',user,'\'@\'',host,'\'') from mysql.user" > user_list_with_header.txt
    sed '1d' user_list_with_header.txt > ./user.txt
    while read user; do  mysql -u<user> -p<password> -h<host> -e"$user" > user_grant.txt; sed '1d' user_grant.txt >> user_privileges.txt; echo "flush privileges" >> user_privileges.txt; done < user.txt
    awk '{print $0";"}'  user_privileges.txt >user_privileges_final.sql
    rm user.txt user_list_with_header.txt user_grant.txt user_privileges.txt
    

    Above script will run in linux environment and output will be user_privileges_final.sql that you can import in new mysql server where you want to copy user privileges.

    UPDATE: There was a missing - for the user of the 2nd mysql statement.

    0 讨论(0)
  • 2021-02-03 17:36

    Yet another bash one-liner for linux to use instead of Percona tool:

    mysql -u<user> -p<password> -h<host> -N mysql -e "select concat(\"'\", user, \"'@'\", host, \"'\"), authentication_string from user where not user like 'mysql.%'" | while read usr pw ; do echo "GRANT USAGE ON *.* TO $usr IDENTIFIED BY PASSWORD '$pw';" ; mysql -u<user> -p<password> -h<host> -N -e "SHOW GRANTS FOR $usr" | grep -v 'GRANT USAGE' | sed 's/\(\S\)$/\1;/' ; done
    
    0 讨论(0)
  • 2021-02-03 17:38

    PhpMyAdminYou can use phpMyAdmin.

    Login and Go to your database or a table where the user has access.

    Select privileges

    All users with access are there.

    Select Export. And a little window with all the GRANTS are there ready to copy and paste.

    0 讨论(0)
提交回复
热议问题