Что такое сокет mysql
Аутентификация unix_socket в MySQL и MariaDB
Суть аутентификации по unix_socket в том, что если пользователь уже выполнил вход в систему, то ему не нужно вводить пароль при подключении к СУБД, поскольку его подлинность уже была проверена при входе в ОС.
На практике, большинство работает под обычным пользователем, а подключается к MySQL как root. В результате возникает обозначенная выше ошибка.
Можно выбрать один из вариантов:
1. Всегда использовать sudo при подключении как root.
2. Внести изменения в настройки MySQL, чтобы к СУБД могли подключаться и обычные пользователи.
3. Создать пользователя MySQL с таким же именем, как имя вашего системного пользователя
Как проверить, какой метод аутентификации используется
Для просмотра используемого метода аутентификации можно использовать следующий SQL запрос:
Или такую, для большей наглядности вывода:
Можно увидеть, что в качестве плагина установлены mysql_native_password и unix_socket:
При такой конфигурации, у меня работала только аутентификация по unix_socket.
Включение и отключение аутентификации по unix_socket
Переключиться на аутентификацию по паролю можно следующим SQL запросом:
Обратите внимание, что вам нужно ввести ПАРОЛЬ.
Чтобы переключиться на аутентификацию по unix_socket выполните следующий SQL запрос:
Если выведено mysql_native_password, то это означает, что используется вход по паролю.
На самом деле, аутентификацию по unix_socket можно сочетать с аутентификацией по паролю, но я не буду на этом останавливаться.
Вариант с update user
Если предыдущий способ не сработал для вас, то для получения доступа к базе данных MySQL обычному пользователю без использования sudo привилегий, зайдите в приглашение командной строки MySQL
и запустите следующие команды:
Затем перезапустите службу MySQL и попробуйте войти в базу данных без sudo, как показано ниже.
Ранее похожий эффект - смены аутентификации с unix_socket на аутентификацию по паролю - достигался с помощью последовательности команд:
Подключение к серверу MySQL:
В приглашении MySQL нужно было выполнить команды:
Затем нужно было перезапустить службу:
И можно было подключаться без sudo.
В показанном выше случае также менялся способ аутентификации с unix_socket на пароль, но при этом не происходила установка нового пароля. Если вы хотите такого же эффекта (хотя это становится небезопасным после отключения аутентификации с unix_socket), то вы можете выполнить следующие запросы (то есть установить пустой пароль):
Выбор способа аутентификации при создании пользователя
Создать пользователя с аутентификацией по паролю можно SQL запросом следующего вида:
Чтобы создать пользователя с аутентификацией по unix_socket выполните следующий SQL запрос:
Говорят, что лучший пароль — тот, который не надо запоминать. В случае с MySQL это реально благодаря плагину auth_socket и его версии для MariaDB — unix_socket.
Оба эти плагина — вовсе не новы, о них много говорилось в этом же блоге, например в статье о том, как изменять пароли в MySQL 5.7, используя плагин auth_socket. Однако, разбирая, что новенького в MariaDB 10.4, я обнаружил, что unix_socket теперь устанавливается по умолчанию и является одним из методов аутентификации ("одним из", потому как в MariaDB 10.4 одному пользователю для аутентификации доступно больше одного плагина, что и объяснятется в документе "Аутентификация" от MariaDB 10.04).
С пакетами Debian для MySQL, root пользователь аутентифицируется следующим образом:
То же и в случае с пакетом .deb для MariaDB:
Пакеты .deb из официального репозитория Percona также настраивают аутентификацию пользователя с root-правами под auth-socket и для Percona Server. Приведем пример с Percona Server for MySQL 8.0.16-7 и Ubuntu 16.04:
Так в чем же магия? Плагин проверяет, что пользователь Linux соответствует пользователю MySQL, используя сокет-опцию SO_PEERCRED — чтобы собрать информацию о пользователе, запускающем клиентскую программу. Таким образом, плагин можно использовать только на системах, поддерживающих опцию SO_PEERCRED, вроде той же Linux. Сокет-опция SO_PEERCRED позволяет узнавать uid связанного с сокетом процесса. А после он уже получает связанное с этим uid имя пользователя.
Приведем пример с пользователем "vagrant":
Поскольку в MySQL нет пользователя "vagrant", в доступе нам отказано. Создадим такого пользователя и повторим попытку:
Получилось!
Ну, а как насчет не-Debian дистрибутива, где это не предусмотрено по умолчанию? Попробуем Percona Server for MySQL 8, установленный на CentOS 7:
Облом. Чего же не хватило? Плагин не загружен:
Добавим в процесс плагин:
Теперь у нас есть все необходимое. Попробуем еще разок:
Теперь можно войти в систему под логином "percona".
И снова получилось!
Вопрос: получится ли войти в систему под тем же логином percona, но от другого ользователя?
Нет, не получится.
Вывод
MySQL достаточно гибкая в нескольких аспектах, один из которых — метод аутентификации. Как видно из этого поста, доступ можно получить без паролей, на основании пользователей ОС. Это может быть полезно при определенных сценариях, и один из них — когда мигрируете с RDS/Aurora на обычную MySQL, пользуясь аутентификацией базы данных IAM, чтобы по-прежнему получать доступ, но без паролей.
Сервер MySQL поддерживает различные способы передачи данных. Соединения могут использовать протоколы TCP/IP, сокеты Unix-доменов или именованные пайпы Windows.
Имя хоста localhost имеет особое значение. Оно используется только в сокетах Unix доменов. Чтобы открыть TCP/IP-соединение с локальным хостом, необходимо использовать 127.0.0.1 вместо имени хоста localhost .
$mysqli = new mysqli ( "localhost" , "user" , "password" , "database" );
echo $mysqli -> host_info . "\n" ;
$mysqli = new mysqli ( "127.0.0.1" , "user" , "password" , "database" , 3306 );
echo $mysqli -> host_info . "\n" ;
Результат выполнения данного примера:
Умолчания для параметров соединений
В зависимости от функции, осуществляющей подключение, какие-то параметры можно не задавать. Если параметр не задан, модуль попытается использовать значение по умолчанию для этого параметра, которое задано в конфигурационном файле PHP.
Далее, чтобы установить соединение, функция передаёт параметры в клиентскую библиотеку, которой пользуется модуль. Если библиотека обнаружит пустые или отсутствующие параметры, она может подставить вместо них свои встроенные значения по умолчанию.
Встроенные библиотечные значения по умолчанию для параметров соединения
Если имя хоста не задано или передана пустая строка, клиентская библиотека использует для подключения к Unix-сокету хоста localhost . Если сокет не задан или передана пустая строка, и при этом запрошено подключение к Unix-сокету, библиотека попытается подключиться к сокету /tmp/mysql.sock .
В Windows-системах, если в качестве имени хоста передаётся . , библиотека попытается открыть соединение на основе именованного пайпа. В этом случае имя сокета будет воспринято как имя пайпа. Если имя сокета не задано, то будет использовано значение \\.\pipe\MySQL .
Если соединение не использует ни сокет Unix-домена, ни именованный пайп Windows, и при этом не задан порт для подключения, библиотека использует номер порта 3306 .
В драйвере mysqlnd и клиентской библиотеке MySQL (libmysqlclient) заложена та же логика определения умолчаний.
Настройки соединения позволяют, например, задать какие-то команды, которые нужно выполнить сразу после подключения, или отдать распоряжение использовать определённый набор символов. Настройки должны быть заданы до подключения к серверу.
Когда требуется задать настройки соединения, операция подключения выполняется в три этапа: функцией mysqli_init() или mysqli::__construct() создаётся дескриптор подключения, затем подключение настраивается с помощью функции mysqli::options() , и наконец устанавливается сетевое соединение с сервером посредством функции mysqli::real_connect() .
Объединение подключений в пул
Модуль mysqli поддерживает постоянные соединения с базой данных, которые представляют из себя специальный вид объединяемых соединений. По умолчанию каждое открытое скриптом соединение закрывается либо самим скриптом в ходе выполнения, либо автоматически по завершении работы скрипта. Постоянные соединения отличаются тем, что не закрываются, а помещаются в пул для повторного использования в дальнейшем. Если требуется подключиться к тому же серверу и базе данных, с тем же именем пользователя, паролем, сокетом и портом, то вместо создания нового подключения из пула извлекается уже существующее. Повторное использование подключений позволяет избежать накладных расходов на создание новых соединений.
Каждый PHP-процесс использует свой пул подключений mysqli. В зависимости от конфигурации веб-сервера, PHP-процесс может обслуживать один или несколько запросов. Соответственно, соединение из пула могут последовательно использовать несколько скриптов.
Новое подключение создаётся, только если в пуле не найдётся свободного подключения с теми же данными хоста, имени пользователя, пароля, сокета, порта и базы данных по умолчанию. Механизм постоянных соединений можно включать и выключать PHP директивой mysqli.allow_persistent. Максимальное количество соединений, которые может открыть скрипт, ограничено значением mysqli.max_links. Максимальное количество соединений, которые может открыть один PHP-процесс, ограничено значением mysqli.max_persistent. Следует заметить, что веб-сервер может порождать множество PHP процессов.
Главный недостаток постоянных подключений заключается в том, что перед повторным использованием их состояние не сбрасывается к изначальному. Например, открытые и незавершённые транзакции не будут автоматически откатываться. Также, если во время нахождения соединения в пуле для процесса изменились какие-либо разрешения или уровни доступа, этот факт никак не отразится на подключении при его извлечении из пула. Такое поведение может привести к нежелательным результатам. Хотя, с другой стороны, название постоянный можно рассматривать, как обещание, что подключение и правда останется в том состоянии, в котором оно было помещено в пул.
Модуль mysqli поддерживает обе интерпретации термина постоянное соединение: состояние соединения может сохраняться, а может и сбрасываться в изначальное. По умолчанию при извлечении из пула, соединение сбрасывается. mysqli делает это неявным вызовом функции mysqli::change_user() каждый раз, когда подключение используется повторно. С точки зрения пользователя подключение выглядит, как только что созданное.
Однако, вызов функции mysqli::change_user() довольно дорогостоящая операция. Для улучшения быстродействия можно перекомпилировать модуль с установленным флагом MYSQLI_NO_CHANGE_USER_ON_PCONNECT .
Выбор между безопасным поведением подключений и наилучшим быстродействием остаётся за пользователем. Здесь нельзя дать однозначного совета. Для простоты использования, по умолчанию включён безопасный режим с очисткой соединений.
Четыре способа подключения mysql-port, TCP, SOCKET, PIPE, SHARED MEMORY
Четыре метода подключения mysql:
1. Что мы обычно используем:
На самом деле, этот путь через Местный носок соединение
Смотри красную линию @localhost
Во-вторых, подключиться через порт
Необходимо добавить номер порта, IP-адрес
MySQL, кроме самых распространенных TCP соединение В дополнение к способу, также предоставьте SOCKET (метод подключения по умолчанию LINUX) 、 PIPE и SHARED Способ подключения ПАМЯТЬ.
Параметры запуска сервера и клиента для каждого метода подключения, а также значения по умолчанию для подключения показаны в следующей таблице:
TCP-соединение (Linux, Windows):
целевой параметр загрузки по умолчанию
SOCKET соединение (Linux):
целевой параметр загрузки по умолчанию
ТРУБНОЕ соединение (Windows):
целевой параметр загрузки по умолчанию
ОБЩАЯ ПАМЯТЬ (Windows):
целевой параметр загрузки по умолчанию
Подробное описание и примеры некоторых других способов:
1、mysqld
Запустите сервер MySQL: ./mysqld --defaults-file=/etc/my.cnf --user=root
Клиентское соединение:
2、mysqld_safe
Запустите сервер MySQL: ./mysqld_safe --defaults-file=/etc/my.cnf --user=root &
Клиентское соединение:
3、mysql.server
Запустите сервер MySQL: service mysql.server
Клиентское соединение: то же, что 1, 2
Примечание: некоторые машины не будут работать.
4、mysqld_multi
mkdir $MYSQL_BASE/data2
cat /etc/my.cnf
Получите результат:
Запустите сервер MySQL: ./mysqld_multi --defaults-file=/etc/my.cnf start 3306-3307
Завершите работу сервера MySQL: mysqladmin shutdown
Интеллектуальная рекомендация
Использование Jmeter Beanshell
Использование Beanshell Что такое бобовая скорлупа Beanshell - это язык сценариев, который полностью соответствует синтаксису Java, и имеет свои собственные встроенные объекты и синтаксис Beans.
Android получить информацию о приложении (пакете) и размере кэша при использовании PackageManager
[size = medium] [b] класс PackageManger [/ b] [/ size] Описание: Получить информацию об установленных приложениях. Его можно получить с помощью метода [color = red] getPackageManager () [/ color]. Общ.
UITextView добавить текст заполнителя
UITextView - это простой и легкий в использовании метод для добавления текста заполнителя. В основном используйте drawRect: метод для рисования текста заполнителя. Создайте файл CustomPlaceholderTextV.
Разница между равным и "= mh-excerpt">
1. Разница между равным и "==" (1) Роль равенства заключается в сравнении одинакового содержимого двух независимых объектов., Другими словами, это для сравнения значений двух объектов. I1, i.
Читайте также: