it-swarm.com.ru

Как экспортировать и импортировать существующего пользователя (с его привилегиями!)

У меня есть существующий экземпляр MySQL (тест), содержащий 2 базы данных и несколько пользователей, каждый из которых имеет разные права доступа к каждой базе данных.

Теперь мне нужно продублировать одну из баз данных (в производство) и пользователей, связанных с ней.

Дублирование базы данных было легко :

Экспорт:

mysqldump --no-data --tables -u root -p secondb >> secondb_schema.sql

Импортировать:

mysql -u root -p -h localhost secondb < secondb_schema.sql

Однако я не нашел простого способа экспортировать и импортировать users из командной строки (внутри или снаружи mysql).

Как мне экспортировать и импортировать user из командной строки?


Update: Пока я нашел ручные (и, следовательно, подверженные ошибкам) ​​шаги для выполнения этого:

-- lists all users
select user,Host from mysql.user;

Тогда найдите его гранты:

-- find privilege granted to a particular user
show grants for 'root'@'localhost'; 

Затем вручную создайте пользователя с грантами, перечисленными в результате выполнения команды «show grants» выше. 

Я предпочитаю более безопасный, более автоматизированный способ. Есть один?

30
Withheld

Один из самых простых способов экспорта пользователей - использование инструмента Percona pt-show-grants. Набор инструментов Percona является бесплатным, простым в установке и использовании, с большим количеством документации…. Это простой способ показать всех пользователей или конкретных пользователей. В нем перечислены все их гранты и результаты в формате SQL. Я приведу пример того, как я бы показал все гранты для test_user:

Shell> pt-show-grants --only test_user

Пример вывода этой команды:

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

Я обычно перезаписываю вывод в файл, чтобы я мог отредактировать то, что мне нужно, или загрузить его в mysql.

В качестве альтернативы, если вы не хотите использовать инструмент Percona и хотите сделать дамп всех пользователей, вы можете использовать mysqldump следующим образом:

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

Примечание: --flush-privileges не будет работать с этим, так как весь db не сбрасывается. это означает, что вам нужно запустить его вручную.

Shell> mysql -e "FLUSH PRIVILEGES"
29
Matthew Carey
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

Вышеупомянутый скрипт будет работать в среде Linux, и на выходе будет user_privileges_final.sql, который вы можете импортировать на новый сервер MySQL, где вы хотите скопировать пользовательские привилегии.

18
Vardan Gupta

Еще одна однострочная оболочка bash для linux вместо Percona:

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
1
Sergey Podushkin

Сценарий PHP для обхода ваших пользователей, чтобы получить команды предоставления, будет следующим:

// Set up database root credentials
$Host = 'localhost';
$user = 'root';
$pass = 'YOUR PASSWORD';
// ---- Do not edit below this ----
// Misc settings
header('Content-type: text/plain; Charset=UTF-8');
// Final import queries goes here
$export = array();
// Connect to database
try {
    $link = new PDO("mysql:Host=$Host;dbname=mysql", $user, $pass);
} catch (PDOException $e) {
    printf('Connect failed: %s', $e->getMessage());
    die();
}

// Get users from database
$statement = $link->prepare("select `user`, `Host`, `password` FROM `user`");
$statement->execute();
while ($row = $statement->fetch())
{
    $user   = $row[0];
    $Host   = $row[1];
    $pass   = $row[2];
    $export[] = 'CREATE USER \''. $user .'\'@\''. $Host .'\' IDENTIFIED BY \''. $pass .'\'';
    // Fetch any permissions found in database
    $statement2 = $link->prepare('SHOW GRANTS FOR \''. $user .'\'@\''. $Host .'\'');
    $statement2->execute();
    if ($row2 = $statement2->fetch())
    {
        $export[] = $row2[0];
    }
}

$link = null;
echo implode(";\n", $export);

Суть: https://Gist.github.com/zaiddabaeen/e88a2d10528e31cd6692

0
zed

PhpMyAdmin Вы можете использовать phpMyAdmin.

Войдите и перейдите в свою базу данных или в таблицу, к которой у пользователя есть доступ.

Выберите привилегии

Все пользователи с доступом есть.

Выберите Экспорт. И маленькое окошко со всеми ГРАНТАМИ готово для копирования и вставки.

0
Mysql MariaDB

У меня такая же проблема. Решение заключается в том, что после импорта резервной копии необходимо выполнить «сброс привилегий»; Тогда привилегии пользователей будут активны как в исходной базе данных.

ТАК 

mysql -u root -p -h localhost secondb <secondb_schema.sql

mysql -u root; затем в mysql: "очистить привилегии";

0
HadTheSameProblem

Я решил эту проблему с помощью небольшой программы на C #. Здесь есть код для генерации скрипта или применения грантов непосредственно от источника к месту назначения. При портировании из среды Windows -> * nix вам, возможно, придется учитывать проблемы с учетом регистра. 

using System;
using MySql.Data.MySqlClient;
using System.Configuration;
using System.IO;
using System.Collections.Generic;

namespace GenerateUsersScript
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> grantsQueries = new List<string>();

            // Get A Show Grants query for each user
            using (MySqlConnection sourceConn = OpenConnection("sourceDatabase"))
            {
                using (MySqlDataReader usersReader = GetUsersReader(sourceConn))
                {
                    while (usersReader.Read())
                    {
                        grantsQueries.Add(String.Format("SHOW GRANTS FOR '{0}'@'{1}'", usersReader[0], usersReader[1]));
                    }
                }

                Console.WriteLine("Exporting Grants For {0} Users", grantsQueries.Count);

                using (StreamWriter writer = File.CreateText(@".\UserPermissions.Sql"))
                {
                    // Then Execute each in turn 
                    foreach (string grantsSql in grantsQueries)
                    {
                        WritePermissionsScript(sourceConn, grantsSql, writer);
                    }

                    //using (MySqlConnection destConn = OpenConnection("targetDatabase"))
                    //{
                    //    MySqlCommand command = destConn.CreateCommand();

                    //    foreach (string grantsSql in grantsQueries)
                    //    {
                    //        WritePermissionsDirect(sourceConn, grantsSql, command);
                    //    }
                    //}
                }
            }

            Console.WriteLine("Done - Press A Key to Continue");

            Console.ReadKey();
        }

        private static void WritePermissionsDirect(MySqlConnection sourceConn, string grantsSql, MySqlCommand writeCommand)
        {
            MySqlCommand cmd = new MySqlCommand(grantsSql, sourceConn);

            using (MySqlDataReader grantsReader = cmd.ExecuteReader())
            {
                while (grantsReader.Read())
                {
                    try
                    {
                        writeCommand.CommandText = grantsReader[0].ToString(); 

                        writeCommand.ExecuteNonQuery();
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(grantsReader[0].ToString());

                        Console.WriteLine(ex.Message);
                    }
                }
            } 
        }

        private static void WritePermissionsScript(MySqlConnection conn, string grantsSql, StreamWriter writer)
        {
            MySqlCommand command = new MySqlCommand(grantsSql, conn);

            using (MySqlDataReader grantsReader = command.ExecuteReader())
            {
                while (grantsReader.Read())
                {
                    writer.WriteLine(grantsReader[0] + ";");
                }
            }

            writer.WriteLine();
        }

        private static MySqlDataReader GetUsersReader(MySqlConnection conn)
        {
            string queryString = String.Format("SELECT User, Host FROM USER");
            MySqlCommand command = new MySqlCommand(queryString, conn);
            MySqlDataReader reader = command.ExecuteReader();
            return reader;
        }

        private static MySqlConnection OpenConnection(string connName)
        {
            string connectionString = ConfigurationManager.ConnectionStrings[connName].ConnectionString;
            MySqlConnection connection = new MySqlConnection(connectionString);
            connection.Open();
            return connection; 

        }
    }
}

с app.config, содержащим ...

    <connectionStrings>
        <add name="sourceDatabase" connectionString="server=localhost;user id=hugh;password=xxxxxxxx;persistsecurityinfo=True;database=MySql" />
        <add name="targetDatabase" connectionString="server=queeg;user id=hugh;password=xxxxxxxx;persistsecurityinfo=True;database=MySql" />
    </connectionStrings> 
0
Hugh Jones