Який кореневий пароль за замовчуванням для MySQL 5.7


79

Не вдається ввійти в базу даних MySQL після свіжої інсталяції з кореневим ідентифікатором та порожнім / відсутнім паролем, як це роблять інші старіші версії MySQL


6
root більше не має, оскільки не використовує. За замовчуванням методом auth є сокет auth. використовуйте sudo для доступу з кореневим доступом, змініть метод автентифікації на пароль і встановіть пароль, якщо вам потрібен кореневий lmysql oogin без доступу до кореневої системи.
G.Martin

3
@ G.Martin, не могли б ви розширити цей коментар у відповідь більш детальними кроками? Я думаю, що це рішення, яке я хочу використовувати, але не знаю, як змінити метод автентифікації. ( sudo mysql -u rootпрацює для мене - я хочу його змінити, щоб я міг просто робити mysql -u rootбез пароля)
Макс Вільямс

Вибачте Ви, напевно, це вже зрозуміли, але я з’ясував, що моя публікація стосується лише дистрибутивів debian. Якщо це все ще проблема (сумнівайтесь), я можу надати більше деталей.
G.Martin

Відповіді:


151

Там так багато відповідей, в яких сказано перевстановити mysql або використовувати якийсь комбінований файл

mysqld_safe --skip-grant-tables

та / або

UPDATE mysql.user SET Password=PASSWORD('password')

та / або щось інше ...

... Ніщо з цього не працювало для мене


Ось, що мені вдалося, в Ubuntu 18.04, зверху

З особливою похвалою цій відповіді за те, що я вирвав мене з розчарування в цьому ...

$ sudo apt install mysql-server
$ sudo cat /etc/mysql/debian.cnf

Зверніть увагу на рядки, в яких написано:

user     = debian-sys-maint
password = blahblahblah

Тоді:

$ mysql -u debian-sys-maint -p
Enter password: // type 'blahblahblah', ie. password from debian.cnf

mysql> USE mysql
mysql> SELECT User, Host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| User             | Host      | plugin                |
+------------------+-----------+-----------------------+
| root             | localhost | auth_socket           |
| mysql.session    | localhost | mysql_native_password |
| mysql.sys        | localhost | mysql_native_password |
| debian-sys-maint | localhost | mysql_native_password |
+------------------+-----------+-----------------------+
4 rows in set (0.00 sec)

mysql> UPDATE user SET plugin='mysql_native_password' WHERE User='root';
mysql> COMMIT;  // When you don't have auto-commit switched on

Або:

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';

Або:

// For MySQL 5.7+
UPDATE mysql.user SET authentication_string=PASSWORD('new_password') where user='root';

Тоді:

mysql> FLUSH PRIVILEGES;
mysql> COMMIT;  // When you don't have auto-commit switched on
mysql> EXIT

$ sudo service mysql restart
$ mysql -u root -p
Enter password: // Yay! 'new_password' now works!

3
Я виконав ці кроки, і це не працює для мене. Все виглядає добре, але як тільки я перезапускаю MySQL, значення плагіна скидається до auth_socket. Будь-яка ідея, чого не вистачає?
Метт Рейбл

4
Спочатку не працював у мене. Потім я спробував видати КОМІТ перед EXIT, і це спрацювало!
LeandroG

2
Працював у мене, але замість використання: mysql -u debian-sys-maint -p, мені довелося використовувати: sudo mysql -u root. Коли я використовував перший, зміни не зберігалися навіть за допомогою COMMIT
Пітер,

2
Потрібно зробити commit;раніше FLUSH PRIVILEGES;.
user218867

3
Перевірив це. Mysql 5.7+, який встановлений за замовчуванням із 18.04 LTS, змінює пароль із UPDATE mysql.user SET authentication_string=PASSWORD('new_password') where user='root';таким чином, вам потрібно запустити це замістьALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
повідомлення

111

Після того, як ви встановили MySQL-community-server 5.7 зі свіжої версії на Linux, вам потрібно буде знайти тимчасовий пароль з /var/log/mysqld.log, щоб увійти як root.

  1. grep 'temporary password' /var/log/mysqld.log
  2. Запустіть, mysql_secure_installationщоб змінити новий пароль

посилання: http://dev.mysql.com/doc/refman/5.7/en/linux-installation-yum-repo.html


7
Дякую! Начебто божевільний знайти цю інформацію тут замість документа MySQL 5.7 від Oracle.
maddin2code

7
Це рятує моє життя ... шукав рішення скрізь, і це вирішує всю мою проблему. Навіть документ із веб-сайту mysql про це не згадував. Це божевільний чоловік. Дякую!
нодефект

21
/var/log/mysqld.log для мене не існує (mariadb на монетному дворі)
donquixote

9
Для тих, хто не може знайти /var/log/mysqld.log, просто біжіть sudo mysql_secure_installation. Запам’ятайте, щоб запустити цю команду, sudoабо ви отримаєте помилку "Доступ заборонено".
SarahCoding

2
sudo mysql_secure_installationне зробить АБСОЛЮТНО НІЧОГО, якщо кореневий обліковий запис MySQL використовує плагін "auth_socket". Я детально
пояснюю

31

MySQL 5.7 змінив безпечну модель: тепер кореневий логін MySQL вимагає sudo

Найпростішим (і найбезпечнішим) рішенням буде створення нового користувача та надання необхідних привілеїв.

1. Підключіться до mysql

sudo mysql --user=root mysql

2. Створіть користувача для phpMyAdmin

CREATE USER 'phpmyadmin'@'localhost' IDENTIFIED BY 'some_pass';
GRANT ALL PRIVILEGES ON *.* TO 'phpmyadmin'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;

Посилання - /ubuntu/763336/cannot-enter-phpmyadmin-as-root-mysql-5-7


5
Чесно кажучи, спочатку я відкинув цю відповідь як досить дурну і спробував купу інших речей, включаючи пошук випадково сформованих паролів у файлах, яких не було на моїй локальній машині Ubuntu. Однак просте SUDO і порожній пароль просто зробили це. Отримайте підтримку!
MrTony

14

Сервер MySQL 5.7 вже був встановлений за замовчуванням на моєму новому Linux Mint 19.

Але що таке rootпароль MySQL ? Виявляється, що:

Інсталяція за замовчуванням використовує auth_socketдля автентифікації замість паролів!

Це дозволяє вхід без пароля за умови, що він увійшов до системи Linux з однаковим іменем користувача. Для входу в систему як корінь MySQL userможна використовувати sudo:

sudo mysql --user=root

Але як потім змінити кореневий пароль? Щоб проілюструвати, що відбувається, я створив нового користувача "я", з повними привілеями, з:

mysql> CREATE USER 'me'@'localhost' IDENTIFIED BY 'my_new_password';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'me'@'localhost' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;

Порівняння "мене" з "коренем":

mysql> SELECT user, plugin, HEX(authentication_string)  FROM mysql.user WHERE user = 'me' or user = 'root';
+------+-----------------------+----------------------------------------------------------------------------+
| user | plugin                | HEX(authentication_string)                                                 |
+------+-----------------------+----------------------------------------------------------------------------+
| root | auth_socket           |                                                                            |
| me   | mysql_native_password | 2A393846353030304545453239394634323734333139354241344642413245373537313... |
+------+-----------------------+----------------------------------------------------------------------------+

Оскільки він використовує auth_socket, кореневий пароль змінити неможливо: SET PASSWORDкоманда не вдається і mysql_secure_installationнічого не досягає ...

==> Щоб застосувати цей альтернативний режим автентифікації та повернути користувача MySQL rootдо використання паролів:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'SOME_NEW_ROOT_PASSWORD';

Гарне пояснення.

Детальніше з посібника MySQL .


7

Якщо ви хочете встановити mysql або percona без нагляду (як у моєму випадку ansible), ви можете використати такий сценарій:

# first part opens mysql log
# second part greps lines with temporary password
# third part picks last line (most recent one)
# last part removes all the line except the password
# the result goes into password variable

password=$(cat /var/log/mysqld.log | grep "A temporary password is generated for" | tail -1 | sed -n 's/.*root@localhost: //p')

# setting new password, you can use $1 and run this script as a file and pass the argument through the script

newPassword="wh@teverYouLikE"

# resetting temporary password

mysql -uroot -p$password -Bse "ALTER USER 'root'@'localhost' IDENTIFIED BY '$newPassword';"

cat: /var/log/mysqld.log: No such file or directoryЯ використовую ubuntu 18.04 і встановив його через tasksel. У вас є пропозиція?
AboElnouR

Я б його розшукував:find / -name mysqld 2>/dev/null
hpaknia

5

MySQL 5.7 або новіша версія генерує тимчасовий пароль за замовчуванням після нової інсталяції.

Щоб спочатку використовувати MySQL, вам потрібно буде отримати цей пароль із файлу журналу, який присутній у /var/log/mysqld.log. Тож дотримуйтесь наступного процесу:

  1. grep 'temporary password' /var/log/mysqld.log

  2. mysql_secure_installation

Друга команда потрібна для зміни пароля для MySQL, а також для внесення деяких інших змін, таких як видалення тимчасових баз даних, надання або заборона віддаленого доступу до кореневого користувача, видалення анонімних користувачів тощо ...


4

Після багатьох спроб я міг скинути пароль за замовчуванням за допомогою таких команд (Ubuntu та похідні):

sudo -i
mkdir -p /var/run/mysqld
chown mysql:mysql /var/run/mysqld
/etc/init.d/mysql stop
mysqld_safe --skip-grant-tables &
mysql -uroot
use mysql;
update user set authentication_string=password('YOURPASSWORD') where user='root';
update user set plugin="mysql_native_password" where User='root';  
flush privileges;
quit;
sudo /etc/init.d/mysql stop
sudo /etc/init.d/mysql start

Іноді навіть після введення в терміналі

mkdir -p /var/run/mysqld
chown mysql:mysql /var/run/mysqld
/etc/init.d/mysql stop
mysqld_safe --skip-grant-tables &

Я отримав помилку, що mysqld не існує. Отже, вийдіть і введіть ті самі команди знову.

І остання команда

sudo /etc/init.d/mysql start

Іноді не працює. Тільки після перезавантаження комп'ютера.


1
Працював над Ubuntu Bionic 18.04 Mysql 5.7.29. Просто думав додати версії. Дякую.
Гевін Сімпсон,

3

Жодна з цих відповідей не працювала для мене на Ubuntu Server 18.04.1 та MySQL 5.7.23. Я витратив купу часу, намагаючись і не вдавшись вручну встановити пароль та плагін для автентифікації, знайти пароль у журналах (його немає) тощо.

Рішення насправді надзвичайно просто:

sudo mysql_secure_installation

Це дійсно важливо робити це за допомогою sudo. Якщо ви спробуєте без підняття, вас попросять ввести пароль користувача root, якого у вас, очевидно, немає.


Дякую товаришу, ти врятував мій день!
avtomaton

3

Здається, речі були розроблені для того, щоб уникнути розробки розробниками кореневого користувача, кращим рішенням було б:

sudo mysql -u root

Потім створіть звичайного користувача, встановіть пароль, а потім використовуйте цього користувача для роботи.

create user 'user'@'localhost' identified by 'user1234';
grant all on your_database.* to 'user'@'localhost';
select host, user from mysql.user;

Потім спробуйте отримати доступ:

mysql -u user -p

Бум!


Ні. Він був розроблений для встановлення пароля для root, а не порожнього пароля.
Райан

1
За замовчуванням він призначений для підключення лише через локальний сокет з рутом. У будь-якому випадку є поганою практикою використовувати root для підключення до MySQL навіть для dev, і моя відповідь описує, як використовувати хорошу практику створення некореневого користувача, який насправді працює.
Пабло Пазос,

1

Я щойно встановив Linux Mint 19 (на базі Ubuntu 18.04) на свою машину. Я встановив MySQL 5.7 з репозиторію ( sudo apt install mysql-server ), і напрочуд під час інсталяції установка не запропонувала ввести пароль користувача root . В результаті я не зміг увійти в MySQL. Я гуглив тут і там і пробував різні відповіді, які знайшов у мережі, включаючи прийняту відповідь вище. Я видалив (очистивши всі dpkgs з mysql в його назві) і знову встановив із сховищ Linux Mint за замовчуванням. НІхто не працює.

Після годин непродуктивних робіт я вирішив переінсталювати MySQL з офіційної сторінки. Я відкрив сторінку завантаження MySQL ( https://dev.mysql.com/downloads/repo/apt ) для apt repo і натиснув кнопку Завантажити внизу праворуч.

Далі запустіть його за допомогою dpkg:

sudo dpkg -i mysql-apt-config_0.8.10-1_all.deb

Під час встановлення виберіть версію MySQL, яку ви хочете встановити. Параметр за замовчуванням - 8.0, але я змінив його на 5.7. Натисніть OK, щоб вийти. Після цього у ваших джерелах програмного забезпечення з’явиться новий репозитарій MySQL.

Оновіть репо:

sudo apt update

Нарешті, встановіть MySQL:

sudo apt install mysql-server

І зараз мені запропонували надати пароль користувача root ! Сподіваюся, це допоможе іншим із таким самим досвідом.


Я цілими днями вирішував це під час встановлення mysql-serverз репозиторію ubuntu, але врешті офіційний, той, який надає MySQL, працює.
Інам Уль Хук,

0

У моєму випадку каталог даних був автоматично ініціалізований --initialize-insecureопцією. Отже /var/log/mysql/error.log, не містить тимчасового пароля, але:

[Попередження] root @ localhost створюється з порожнім паролем! Будь ласка, розгляньте можливість вимкнення опції --initialize-unscure.

Що працювало:

shell> mysql -u root --skip-password
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';

Деталі: Довідковий посібник MySQL 5.7> 2.10.4 Захист початкового облікового запису MySQL


0

Я стикався з тією ж проблемою, і єдине, що мені вдалося зробити, щоб це спрацювало, це пройти цей шлях:

drop user admin@localhost;
flush privileges;
create user admin@localhost identified by 'admins_password'

Це дозволило мені створити своє ім’я користувача та ввести пароль для імені користувача.


0

Починаючи з Ubuntu 20.04 з MySql 8.0 : ви можете встановити пароль таким чином:

  1. увійти в mysql за допомогою sudo mysql -u root

  2. змінити пароль:

USE mysql;
UPDATE user set authentication_string=NULL where User='root';
FLUSH privileges;
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'My-N7w_And.5ecure-P@s5w0rd';
FLUSH privileges;
QUIT

тепер ви повинні мати можливість входу за допомогою mysql -u root -p(або до phpMyAdmin з іменем користувача root) та вибраного вами пароля.

P, S:

Ви також можете увійти з користувачем debian-sys-maint, пароль записаний у файлі/etc/mysql/debian.cnf


0

Щоб зробити це в неінтерактивному режимі (зі сценарію):

systemctl start mysqld
MYSQL_ROOT_TMP_PSW=$(grep 'temporary password' $logpath/mysqld.log |sed "s|.*: ||")

## POPULATE SCHEMAS WITH ROOT USER
/usr/bin/mysql --connect-expired-password -u root -p${MYSQL_ROOT_TMP_PSW} < "$mysql_init_script"

Ось заголовок сценарію init

SET GLOBAL validate_password_policy=LOW;
FLUSH privileges;

SET PASSWORD = PASSWORD('MYSQL_ROOT_PSW');
FLUSH privileges;

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
FLUSH privileges;

...

Потім перезапустіть службу systemctl restart mysqld

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.