Вам нужно использовать -p
флаг для отправки пароля. И это сложно, потому что у вас не должно быть пробелов между -p
и паролем.
$ mysql -h "server-name" -u "root" "-pXXXXXXXX" "database-name" < "filename.sql"
Если вы используете пробел после -p
того, как он заставит клиент mysql интерактивно запрашивать пароль, а затем он интерпретирует следующий аргумент команды как имя базы данных:
$ mysql -h "server-name" -u "root" -p "XXXXXXXX" "database-name" < "filename.sql"
Enter password: <you type it in here>
ERROR 1049 (42000): Unknown database 'XXXXXXXX'
На самом деле я предпочитаю хранить пользователя и пароль в ~ / .my.cnf, поэтому мне вообще не нужно помещать его в командную строку:
[client]
user = root
password = XXXXXXXX
Затем:
$ mysql -h "server-name" "database-name" < "filename.sql"
Re ваш комментарий:
Я все время запускаю команды mysql в пакетном режиме, подобные приведенным выше, в командной строке и в сценариях оболочки. Трудно диагностировать, что не так с вашим сценарием оболочки, потому что вы не предоставили точный сценарий или какие-либо сообщения об ошибках. Я предлагаю вам отредактировать исходный вопрос выше и привести примеры того, что идет не так.
Кроме того, когда я устраняю неполадки в сценарии оболочки, я использую -x
флаг, чтобы видеть, как он выполняет каждую команду:
$ bash -x myscript.sh
+ mysql -h dbservername -u user-name -ppassword dbname</br> : No such file or directoryids.sql</br> + $'\r' : command not found2:
Это сообщение об ошибке, которое я получил-p
если пароль пустой или пустая строка, возможно, вы можете обновить свой пост? :)Используйте этот синтаксис:
источник
"command1;command2;....;commandn"
части этого ответа не получится. Использование его для замены использования перенаправленного файла в синтаксисе OP может работать. Я рассмотрел эту проблему в своем ответе на этот вопрос.Все предыдущие ответы великолепны. Если вы хотите запустить простую однострочную команду sql, вы также можете использовать параметр -e.
источник
Как выполнить сценарий SQL, используйте этот синтаксис:
Если вы используете host как localhost, вам не нужно об этом упоминать. Вы можете использовать это:
Это должно работать для Windows и Linux.
Если содержимое пароля содержит
!
(восклицательный знак), вы должны добавить\
(обратную косую черту) перед ним.источник
На суть вопроса уже был дан ответ несколько раз, я просто подумал, что добавлю, что обратные кавычки имеют beaning как в сценариях оболочки, так и в SQL. Если вам нужно использовать их в SQL для указания имени таблицы или базы данных, вам нужно будет экранировать их в сценарии оболочки следующим образом:
Конечно, генерация SQL с помощью конкатенированного пользовательского ввода (переданные аргументы) не должна выполняться, если вы не доверяете пользовательскому вводу. Было бы намного безопаснее поместить его на другом языке сценариев с поддержкой параметров / правильным экранированием строк для вставки в MySQL.
источник
(
sql_script_file
при необходимости используйте полный путь )Если вы хотите перенаправить вывод в файл
источник
Вы забыли
-p
или--password=
(второе лучше читается):(Кавычки не нужны, если вы уверены, что ваши учетные данные / имена не содержат пробелов или специальных символов оболочки.)
Обратите внимание, что на странице руководства также говорится, что предоставление учетных данных в командной строке небезопасно. Так что следуйте совету Билла о my.cnf.
источник
Как было сказано ранее, вы можете использовать -p для передачи пароля серверу.
Но я рекомендую это:
Обратите внимание, что пароля нет. Затем он запросит у вас пароль. Я бы ТОГДА ввел его. Чтобы ваш пароль не попал в историю командной строки сервера.
Это основная мера безопасности.
Если безопасность не вызывает беспокойства, я бы просто временно удалил пароль от пользователя базы данных. Потом после импорта - заново добавить.
Таким образом, любые другие учетные записи, которые могут иметь один и тот же пароль, не будут скомпрометированы.
Также кажется, что в вашем сценарии оболочки вы не ждете / не проверяете, действительно ли существует файл, который вы пытаетесь импортировать. Возможно, сценарий Perl еще не завершен.
источник
perl fb_apps_frm_fb.pl
</br> perl fb_new_spider.pl ds_fbids.txt ds_fbids.sql` </br>mysql -h dbservername -u username -ppassword dbname < ds_fbids.sql
использование
источник
Чтобы «автоматизировать» процесс импорта сгенерированного
.sql
файла, избегая при этом всех ловушек, которые могут быть скрыты при попытке передать файлы,stdin
иstdout
просто скажите MySQL выполнить сгенерированный.sql
файл с помощьюSOURCE
команды в MySQL.Синтаксис краткого, но отличного ответа от Кшитиджа Суда дает лучшую отправную точку. Короче говоря, измените команду OP в соответствии с синтаксисом Кшитиджа Суда и замените команды в нем на
SOURCE
команду:Если имя базы данных включено в сгенерированный
.sql
файл, его можно исключить из команды.Здесь предполагается, что сгенерированный файл действителен как
.sql
файл сам по себе. Поскольку файл не перенаправляется, не передается по конвейеру или не обрабатывается оболочкой каким-либо другим образом, нет проблем с необходимостью экранирования любого из символов в сгенерированном выводе из-за оболочки. Правила относительно того, что нужно экранировать в.sql
файле, конечно, по-прежнему применяются.Как решить проблемы безопасности, связанные с паролем в командной строке, или в
my.cnf
файле, и т. Д., Было хорошо рассмотрено в других ответах с некоторыми отличными предложениями. Мой любимый ответ , от Дэнни , обложки , которые, в том числе , как справиться с проблемой при работе сcron
работы, или что - нибудь еще.Чтобы ответить на комментарий (вопрос?) К краткому ответу, который я упомянул: Нет, его нельзя использовать с синтаксисом HEREDOC, поскольку указана эта команда оболочки. HEREDOC можно использовать в синтаксисе версии перенаправления (без
-Bse
опции), поскольку перенаправление ввода-вывода - это то, на чем построен HEREDOC. Если вам нужна функциональность HEREDOC, было бы лучше использовать ее при создании.sql
файла, даже если он временный, и использовать этот файл в качестве «команды» для выполнения с помощью командной строки MySQL.Имейте в виду, что из-за расширения оболочки вы можете использовать переменные оболочки и среды в HEREDOC. Обратной стороной является то, что вы должны избегать каждой обратной кавычки. MySQL использует их в качестве разделителей для идентификаторов, но оболочка, которая первой получает строку, использует их в качестве разделителей исполняемых команд. Пропустите escape-код по одной обратной кавычке в команде MySQL, и все это взорвется ошибками. Всю проблему можно решить, используя указанную в кавычках LimitString для HEREDOC:
Удаление расширения оболочки таким образом устраняет необходимость экранировать обратные кавычки и другие специальные символы оболочки. Он также удаляет возможность использовать в нем переменные оболочки и среды. Это в значительной степени устраняет преимущества использования HEREDOC внутри сценария оболочки для начала.
Другой вариант - использовать строки в многострочных кавычках, разрешенные в Bash, с версией синтаксиса пакета (с
-Bse
). Я не знаю других оболочек, поэтому не могу сказать, работают ли они и в них. В любом случае вам нужно будет использовать это для выполнения более чем одного.sql
файла сSOURCE
командой, поскольку это не завершается a,;
как другие команды MySQL, и только один разрешен на строку. Многострочная строка может быть заключена в одинарные или двойные кавычки с обычным эффектом расширения оболочки. Здесь также есть те же предостережения, что и при использовании синтаксиса HEREDOC для обратных кавычек и т. Д.Потенциально лучшим решением было бы использовать язык сценариев, Perl, Python и т. Д., Для создания
.sql
файла, как это сделал OP, иSOURCE
этот файл с использованием простого командного синтаксиса вверху. Языки сценариев намного лучше справляются со строками, чем оболочка, и большинство из них имеют встроенные процедуры для обработки кавычек и экранирования, необходимых при работе с MySQL.источник
Важным соображением для доступа к mysql из сценария оболочки, используемого в cron, является то, что mysql смотрит на зарегистрированного пользователя, чтобы определить .my.cnf для загрузки.
Это не работает с cron. Это также может сбивать с толку, если вы используете su / sudo, поскольку зарегистрированный пользователь может не быть пользователем, от имени которого вы работаете.
Я использую что-то вроде:
Просто убедитесь, что права собственности и права доступа пользователей и групп установлены правильно и строго в файле .my.cnf.
источник
источник
Как мне выполнить командную строку с безопасным паролем ?? используйте редактор конфига !!!
Начиная с mysql 5.6.6, вы можете сохранить пароль в файле конфигурации, а затем выполнять такие команды cli ....
--login-path заменяет переменные ... хост, пользователь И пароль. отличное право!
источник
Я написал сценарий оболочки, который будет читать данные из файла свойств, а затем запускать сценарий mysql в сценарии оболочки. обмен этим может помочь другим.
источник