Как создать пользователя MySQL без пароля — необходимого для удаленного входа — для использования в скрипте вставки bash?

#mysql #bash

#mysql #bash

Вопрос:

Мое требование — создать пользователя для удаленного входа, но без пароля. В моем удаленном пространстве я использую скрипт bash для выполнения вставок, который представляет собой что-то вроде:

 for i in {1..5000}; do
  mysql -h 11.40.3.169 -uUser -pPass -DDatabaseName <<<
    "insert into DatabaseTableName values('$i','dummy_$i');" amp;
  echo -n "$i  "
  sleep 1
  date
done
  

Проблема в том, что каждая вставка занимает почти 4 секунды, и я не могу точно определить проблему ни с чем, кроме аутентификации при каждой вставке. Итак, если бы я мог создать пользователя в MySQL с минимальной задействованной аутентификацией…Что-то вроде:

 # I'm trying to remove this password
GRANT ALL PRIVILEGES TO 'user'@'%' IDENTIFIED BY 'password';
  

…Все, что вы можете предложить.

Комментарии:

1. Я знаю, что это немного запоздало, но: вы пробовали перебирать числа, чтобы сначала создать все запросы. Помещаем эти запросы в файл, а затем передаем этот файл в mysql для пакетного выполнения?

Ответ №1:

Просто удалите IDENTIFIED BY часть:

 GRANT ALL PRIVILEGES ON *.* TO 'user'@'%'
  

Обратите внимание, что удаленный вход в систему из любого места без пароля — очень небезопасная вещь. Вам лучше ограничить разрешенный IP диапазон для этого пользователя:

 GRANT ALL PRIVILEGES  ON *.* TO 'user'@'allowed_remote_machine'
  

Комментарии:

1. спасибо за быстрый ответ, Квассной, но 2 указанные вами команды выдали ошибку и не разрешены, по крайней мере, в MySQL 5.1 [ОШИБКА 1133 (42000): не удается найти ни одной подходящей строки в таблице user].. Я пробовал их раньше и попробовал их снова после прочтения вашего ответа… пожалуйста, помогите мне с этой проблемой .. и спасибо за совет по небезопасной проблеме.

2. @Chirayu: у вас есть NO_AUTO_CREATE_USER на. Проблема CREATE USER 'user'@'allowed_remote_machine' первая. Также, пожалуйста, обратите внимание на совет @cbz: это то, что вы, вероятно, хотите вместо создания пользователя без пароля.

3. что ж .. ваша идея сработала .. большое спасибо .. но вся моя идея в том, чтобы сократить процесс удаленной вставки в скрипте bash как можно быстрее, по-прежнему fails….as для выполнения 1 вставки все еще требуется почти 4 секунды … какие-нибудь мудрые слова по этому поводу ?!, поможет ли ответ cbz?

4. @Chirayu: сделайте две вставки подряд в одном сеансе и посмотрите, является ли это проблемой.

5. Дело в том, что если я использую скрипт bash, как указано в моем вопросе, даже без пароля (моя глупая попытка), каждая ВСТАВКА все равно занимает 4 секунды.. Если я подам в суд на команду типа — time mysql -h 11.40.3.179 -ucd -DDatabaseName <<<‘select * from DatabaseTableName;’ , это все равно займет 4,5 secs……it только если я вхожу в mysql из удаленного местоположения и начинаю выполнять ВСТАВКИ, ВЫБИРАЕТ и т.д., Это происходит очень-очень быстро .. как миллисекунды…

Ответ №2:

Вы можете сделать это, создав пользователя с паролем, а затем поместив файл .my.cnf в домашний каталог учетной записи, которая запускает скрипт bash, содержащий следующее:

 [mysql]
user=user
password=pass
[mysqladmin]
user=user
password=pass
  

Это может быть лучше, чем создание пользователя без пароля.

Комментарии:

1. Большое спасибо cbz за быстрый ответ, я читал нечто подобное где-то в сети, но не могу разобраться в этом … где именно мне нужно это сохранить?! (извините, если я звучу глупо) .. пожалуйста, помогите.

2. В домашнем каталоге, принадлежащем пользователю, который будет запускать скрипт bash — в данном случае, вероятно, в вашем «удаленном пространстве»

3. Вы имеете в виду, скажем, с удаленной машины, на которой я вхожу как ‘SomeUser’, а затем запускаю скрипт bash, я должен перейти в домашний каталог после того, как я вошел в удаленный компьютер как ‘SomeUser’ и сохранить файл my.cnf, который содержит только информацию, указанную в вашем ответе ?!

4. Если я войду на этот удаленный сервер Linux через ssh-клиент (PuTTY), используя имя пользователя и пароль, которые у меня есть на сервере на базе Linux… где мне тогда его хранить ?! .. большое спасибо, что все еще отвечаете..

5. Хорошо, вероятно, последний вопрос, если это сработает — я нашел файл в etc my.cnf на сервере Linux, я должен добавить к нему то, что вы сказали .. верно?! (хотя у меня нет разрешения на редактирование .. но я могу найти кого-нибудь, у кого есть), и после того, как я это сделаю, как изменится моя команда доступа к mysql и т.д.??

Ответ №3:

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

Время запуска клиента (и подключения к хосту) убивает вас. Я обычно выполняю 1000 вставок в минуту из программы php или Java в базу данных MySQL с миллионами записей на небольшом компьютере (процессор / память).

Ответ №4:

Не очень хорошая идея иметь пользователя без пароля и всех привилегий. Я предлагаю вам создать пользователя без пароля, но просто с некоторыми привилегиями (вставить в определенную таблицу или конкретную базу данных).

Комментарии:

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

2. Я думаю, что лучшее решение предложено cbz. Просто добавьте своего пользователя и пароль в свой файл параметров.

3. прошу прощения за мое незнание Linux .. но где именно я должен хранить файл my.cnf, как предложил @cbz ??, Я вхожу на сервер Linux удаленно с помощью ssh-клиента (putty), используя имя пользователя и пароль, которые у меня есть на этом сервере…

Ответ №5:

Во-первых, использование клиентского cnf-файла на удаленной машине, на которой запущен скрипт, не ускорит это. Клиент MySQL по-прежнему отправляет информацию для входа и выполняет вход для каждой вставки, он просто читает.a файл для uid / pw вместо использования аргументов строки cmd. AFAIK Издержки сети и аутентификации идентичны. Даже содержимое сетевого пакета будет таким же.

Вы все равно должны использовать файл cnf..

Способ повысить производительность — выполнять многострочные linserts:

 MySQL --defaults-file=/some/uid/pw/etc/.client.cnf -e 
"Insert into 
  tbl_name
    ('fld1','fld2')
  values
    ('r1-fld1','r1-fld2'),
    ('r2-fld2','r2-fld2'),
...and so on (up to max_allowed_packet_size)
    ('r500-fld2','r500-fld2');"
  

Или ПРОЧИТАТЬ файл ДАННЫХ на стороне сервера после отправки по файлу данных