ไม่สามารถเข้าสู่ระบบในฐานะ root ผู้ใช้ mysql จากบัญชีผู้ใช้ปกติใน Ubuntu 16.04


203

ฉันเพียงแค่ติดตั้ง Ubuntu 16.04 LTS พร้อมกับแพคเกจphp, และmariadb nginxฉันวิ่งmysql_secure_installationและเปลี่ยนรหัสผ่านรูท

ตอนนี้เมื่อฉันพยายามเข้าสู่ระบบmysqlโดยใช้บัญชีรูทในขณะที่เข้าสู่ระบบ Ubuntu เป็นบัญชีผู้ใช้ปกติที่ฉันได้รับการเข้าถึงถูกปฏิเสธ

เมื่อฉันเข้าสู่ระบบโดยใช้sudo mysqlmysql ไม่ได้ถามรหัสผ่าน หากฉันเรียกใช้mysql_secure_installtionฉันเห็นว่าการตั้งค่าเก่าไม่เคยได้รับการตั้งค่าอย่างถาวร

ผมทำอะไรผิดหรือเปล่า?

คำตอบ:


359

ฉันเพิ่งอัพเกรด Ubuntu 15.04 เป็น 16.04 และสิ่งนี้ใช้ได้กับฉัน:

  1. ก่อนอื่นให้เชื่อมต่อใน sudo mysql

    sudo mysql -u root
    
  2. ตรวจสอบบัญชีของคุณที่มีอยู่ในฐานข้อมูลของคุณ

    SELECT User,Host FROM mysql.user;
    +------------------+-----------+
    | User             | Host      |
    +------------------+-----------+
    | admin            | localhost |
    | debian-sys-maint | localhost |
    | magento_user     | localhost |
    | mysql.sys        | localhost |
    | root             | localhost |
    
  3. ลบบัญชี root @ localhost ปัจจุบัน

    mysql> DROP USER 'root'@'localhost';
    Query OK, 0 rows affected (0,00 sec)
    
  4. สร้างผู้ใช้ของคุณใหม่

    mysql> CREATE USER 'root'@'%' IDENTIFIED BY '';
    Query OK, 0 rows affected (0,00 sec)
    
  5. ให้สิทธิ์แก่ผู้ใช้ของคุณ (อย่าลืมลบสิทธิ์)

    mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
    Query OK, 0 rows affected (0,00 sec)
    
    mysql> FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0,01 sec)
    
  6. ออกจาก MySQL และลองเชื่อมต่อใหม่โดยไม่ต้อง sudo

ฉันหวังว่านี่จะช่วยให้ใครบางคน :)


16
นี่เป็นสิ่งเดียวที่ได้ผลสำหรับฉันมีคนรู้หรือไม่ว่าเกิดอะไรขึ้นกับผู้ใช้รูทเมื่อคุณติดตั้ง mysql-server บน 16.04?
Ruggi

32
ถือมันไม่ได้%หมายความว่าคุณสามารถเชื่อมต่อได้จากทุกที่ ... จากระยะไกล?
Stevie G

9
คุณสามารถเปลี่ยนแถวเป็น: สร้างผู้ใช้ 'รูท' @ 'localhost' ระบุโดย '';
vladnev

11
สำหรับเรื่องที่เกี่ยวกับความปลอดภัย: รูปแบบการเชื่อมต่อที่ไม่ปลอดภัยของ root @ localhost mysql นั้นเป็นส่วนประกอบสำคัญของการพัฒนาท้องถิ่นแต่ควรปรากฏที่อื่นอย่างแน่นอน
Charney Kaye

5
คำสั่งให้สำหรับผู้ใช้รูทใหม่ที่นี่ไม่ได้ให้ "กับการอนุญาต" เพื่อรูทเพื่อให้รูทไม่สามารถให้สิทธิ์โดยไม่เรียกใช้หลังจากนี้: dba.stackexchange.com/a/62046/115679 โปรดเปลี่ยนคำสั่งให้เป็นgrant all privileges on *.* to 'root'@'localhost' with grant option;
Loren

132

หากคุณติดตั้ง 5.7 และไม่ได้ระบุรหัสผ่านให้กับrootผู้ใช้มันจะใช้auth_socketปลั๊กอิน ปลั๊กอินนั้นไม่สนใจและไม่ต้องการรหัสผ่าน มันแค่ตรวจสอบว่าผู้ใช้เชื่อมต่อโดยใช้ซ็อกเก็ต UNIX แล้วเปรียบเทียบชื่อผู้ใช้

นำมาจากการเปลี่ยนรหัสผ่านของผู้ใช้ใน MySQL 5.7 ด้วย "plugin: auth_socket"

ดังนั้นเพื่อเปลี่ยนpluginกลับเป็นmysql_native_password:

  1. เข้าสู่ระบบด้วย sudo:

    sudo mysql -u root
    
  2. เปลี่ยนpluginและตั้งรหัสผ่านด้วยคำสั่งเดียว:

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

แน่นอนคุณสามารถใช้คำสั่งด้านบนเพื่อตั้งรหัสผ่านที่ว่างเปล่า

เพียงเพื่อบันทึก (และMariaDB < 10.2ผู้ใช้) นอกจากนี้ยังมีวิธีอื่นในการเปลี่ยนแปลงpluginโดยไม่ต้องให้รหัสผ่าน (ปล่อยว่างไว้):

update mysql.user set plugin = 'mysql_native_password' where User='root';
// to change the password too (credits goes to Pothi Kalimuthu)
// UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('secret') WHERE User = 'root';
FLUSH PRIVILEGES;

2
ขอขอบคุณด้วยเหตุผลบางอย่างนี้ได้ตั้งค่าโดยอัตโนมัติหลังจากที่จู่ ๆ ก็ฉลาดได้รับการอัพเกรดฉันคิดว่า ...
Tominator

4
นอกจากนี้ฉันชอบคำตอบนี้มากขึ้น - มันทำลายได้น้อยกว่ามาก ;-)
benzkji

3
สำหรับ MariaDB <10.2 เพื่อเปลี่ยนปลั๊กอินพร้อมด้วยรหัสผ่านนี่คือข้อความค้นหา: UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('secret') WHERE User = 'root'; FLUSH PRIVILEGES;ที่มา: stackoverflow.com/a/41537019/1004587
Pothi Kalimuthu

5
นี่ควรเป็นคำตอบที่ได้รับการยอมรับ
Geo C.

3
ฉันหวังว่าฉันจะลงคะแนนได้สองครั้ง
James Smith

21

ในระยะสั้นบน MariaDB

UPDATE mysql.user SET plugin = 'mysql_native_password', 
      Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';

โดยที่คุณแทนที่ NEWPASSWORD ด้วยรหัสผ่านที่คุณต้องการและทุกอย่างจะเป็นคำต่อคำ

ปัญหาที่นี่คือเมื่อ MariaDB หรือ MySQL ได้รับการติดตั้ง / อัพเดท (โดยเฉพาะอย่างยิ่งถ้าในบางจุดรูทถูกตั้งค่าโดยไม่มีรหัสผ่าน) จากนั้นในตารางผู้ใช้รหัสผ่านจะว่างเปล่าจริง ๆ (หรือเพิกเฉย) และการล็อกอินขึ้นอยู่กับผู้ใช้ระบบ สำหรับผู้ใช้ MySQL คุณสามารถทดสอบได้ดังนี้โดยสลับไปที่รูทของระบบแล้วพิมพ์:

mysql -uroot -p

จากนั้นป้อนรหัสผ่านหรือรหัสผ่านไม่ถูกต้อง คุณอาจได้รับอนุญาตให้ใช้ (คุณอาจสามารถเข้าสู่ระบบจาก unix root ได้โดยเพียงแค่# mysqlใช้รหัสผ่านที่ไม่เกี่ยวข้องและผู้ใช้กำหนดไว้)

แล้วเกิดอะไรขึ้น ถ้าคุณเข้าสู่ระบบด้วยรูทและทำสิ่งต่อไปนี้:

select User,host,plugin from mysql.user; 
+----------------+-----------+-----------------------+
| User           | host      | plugin                |
+----------------+-----------+-----------------------+
| root           | localhost | auth_socket           |
+----------------+-----------+-----------------------+

คุณจะทราบauth_socket(ซึ่งอาจอ่านunix_socketบน MariaDB) ซ็อกเก็ตเหล่านี้ไม่สนใจรหัสผ่านและอนุญาตให้ผู้ใช้ Unix ที่สอดคล้องกันโดยไม่ต้องตรวจสอบรหัสผ่าน นี่คือเหตุผลที่คุณสามารถล็อกอินด้วยรูทแต่ไม่ใช่กับผู้ใช้อื่น

ดังนั้นวิธีแก้ไขคือการอัพเดตผู้ใช้ไม่ให้ใช้auth_socket/unix_socketและตั้งรหัสผ่านอย่างถูกต้อง

บน MariaDB (<10.2 ดูความคิดเห็นด้านล่าง) ซึ่งอยู่ใน Ubuntu เวอร์ชัน 16 ตั้งแต่ปี 2560 สิ่งนี้น่าจะเพียงพอ NEWPASSWORD เป็นรหัสผ่านของคุณ mysql_native_passwordคุณพิมพ์คำต่อคำ

UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';

(เป็นไปได้ว่าการตั้งค่าปลั๊กอินให้ว่างจะใช้งานได้ YMMV ฉันไม่ได้ลองทำเช่นนี้เป็นทางเลือก)

UPDATE mysql.user SET plugin = '', Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';

มิฉะนั้น:

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

แล้วก็

FLUSH PRIVILEGES;

สำหรับเร็กคอร์ดโซลูชันที่เกี่ยวข้องกับการลบผู้ใช้และสร้างใหม่ด้วย '%' ทำให้ฉันถูกล็อกออกจากฐานข้อมูลทั้งหมดและอาจทำให้เกิดปัญหาอื่น ๆ เว้นแต่ว่าคุณจะได้รับคำgrantสั่งที่ถูกต้อง - ง่ายกว่าเพียงแค่อัพเดตรูทที่คุณมี

จากประสบการณ์ของฉันปัญหาเกิดขึ้นกับผู้ใช้รูทเท่านั้นเนื่องจากผู้ใช้รายอื่นจะถูกเพิ่มด้วยตนเองไม่ใช่ส่วนหนึ่งของการติดตั้ง / อัปเดตเริ่มต้น


2
พบว่ามันทำงานได้อย่างสมบูรณ์ ทำให้ฉันสงสัยว่าทำไมการเปลี่ยนรหัสผ่านรูทด้วยmysql_secure_installationจึงไม่มีผลเหมือนกัน เก็บรหัสผ่านใหม่ไว้ที่ไหน
Mausy5043

คุณสามารถแก้ไขคำตอบของคุณและพูดเพิ่มเติมเกี่ยวกับแต่ละคำสั่งในขณะที่คุณไป? ฉันยังไม่ชัดเจนว่าจะใช้กับอะไร มันเป็นสองตัวUPDATEที่ใช้กับ MariaDB <10.2 และALTERรุ่นอื่น ๆ หรือไม่? และอันที่สองUPDATEเป็นทางเลือกแรกหรือเราจำเป็นต้องพิมพ์ทั้งสอง? ในที่สุดคือ 'mysql_native_password' เพื่อพิมพ์คำต่อคำหรือเราควรแทนที่ด้วยรหัสผ่านรูทสำหรับ MySQL หรือไม่
Michael Scheper

1
@MichaelScheper กลับมาอีกซักพักแล้วฉันไม่ต้องการแก้ไขมากนัก แต่นี่คือสิ่งที่ฉันจำ (1) ทำ UPDATE แรกเท่านั้น (<10.2 อาจไม่เป็นข้อกำหนด) (2) ใช่พิมพ์ 'mysql_native_password' verbatim โดยพื้นฐานแล้วสิ่งที่คุณกำลังทำอยู่คือบอก mariadb: "อย่าใช้ Unix priveleges ให้ใช้ Priveleges ฐานข้อมูล" mysql_native_passwordเป็นตัวเลือกที่
Gazzer

ประณามฉันสะกด 'สิทธิ์' ผิด!
Gazzer

1
ดูเหมือนว่าคุณจะพลาดเวลาแก้ไขเพียง 1 by นาทีเช่นกัน! บางครั้งฉันก็รู้สึกหงุดหงิดเช่นกัน อย่างไรก็ตามขอบคุณ!
Michael Scheper

8

หากคุณได้ติดตั้ง MySQL / MariaDB จากที่เก็บฐานผู้ใช้ไม่สามารถลงชื่อเข้าใช้ MySQL ในฐานะผู้ใช้รูทของ MySQL จากการล็อกอิน Unix ของพวกเขา (ไม่สามารถใช้ได้ถ้าพวกเขามีการเข้าถึงsudo )

  1. ลงชื่อเข้าใช้ MySQL รูทเชลล์:

    $ sudo mysql -u root -p
    
  2. ดำเนินการแบบสอบถามด้านล่าง:

    use mysql;
    update user set plugin='mysql_native_password' where user='root';
    flush privileges; 
    quit;
    
  3. เปิดเชลล์ใหม่จากนั้น:

    $ mysql -u root -p
    

แหล่ง


เมื่อฉันทำสิ่งนี้ฉันไม่สามารถ sudo mysql เป็น root ได้อีกต่อไป ฉันต้อง su ก่อนแล้วจึงเข้าสู่ mysql เป็น root ดังนั้นฉันเปลี่ยนกลับเป็น auth_socket
จนถึง

คำสั่งเดียว:mysql -u root -p -e "use mysql;update user set plugin='mysql_native_password' where user='root';flush privileges;"
Chris Stryczynski

หากคุณไม่ต้องการเข้าถึงอินสแตนซ์ MySQL ของคุณคำตอบนี้เป็นวิธีที่ง่าย
Danila Vershinin

2

ลองสร้างบัญชี mysql ใหม่สำหรับฉันมันใช้งานได้แล้ว (mysql 5.7.12):

  1. เข้าสู่ระบบด้วย sudo:

    sudo mysql -uroot
    
  2. สร้างผู้ใช้ใหม่และให้สิทธิ์เขา (ไม่มีรหัสผ่าน):

    CREATE USER 'admin'@'localhost' IDENTIFIED BY '';
    GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';
    
  3. เข้าสู่ระบบในฐานะผู้ใช้ใหม่:

    mysql -uadmin
    

2

ฉันต้องทำสองสิ่ง (ขอบคุณ @Todor และ @Loremhipsum):

update mysql.user set plugin = 'mysql_native_password' where User='root';
grant all privileges on *.* to 'root'@'localhost';

แล้ว:

FLUSH PRIVILEGES;

rootฉันจะไม่ขอแนะนำให้ผู้ใช้ลดลง


1

ลองรหัสนี้ก่อน

echo "CREATE USER 'root'@'localhost' IDENTIFIED BY 'root';" > your_init_file.sql
echo "GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;" >> your_init_file.sql 
echo "FLUSH PRIVILEGES;" >> your_init_file.sql

จากนั้น

killall mysqld
mysqld_safe --init-file=$PWD/your_init_file.sql

จากนั้นกดCtrl+Zและพิมพ์: bgเพื่อเรียกใช้กระบวนการจากเบื้องหน้าเป็นพื้นหลังจากนั้นยืนยันการเข้าถึงของคุณโดย:

mysql -u root -proot
mysql> show grants;

1

หากคุณเพียงแค่รันคำสั่ง mysql ภายใต้ผู้ใช้รูทคุณจะได้รับสิทธิ์การเข้าถึงโดยไม่ต้องขอรหัสผ่านเนื่องจากการเปิดใช้งานการพิสูจน์ตัวตนซ็อกเก็ตสำหรับรูท @ localhost .

วิธีเดียวในการตั้งรหัสผ่านคือสลับไปใช้การรับรองความถูกต้องดั้งเดิมเช่น:

$ sudo mysql

mysql> แก้ไขผู้ใช้ 'root' @ 'localhost' ที่ระบุด้วย mysql_native_password BY 'test';


0

ฉันได้ปรับสคริปต์การเตรียมบางอย่างที่ฉันสร้างขึ้นเพื่อใช้ MariaDB และพบปัญหานี้แน่นอน รวบรวมข้อมูลจำนวนมากที่นี่คำตอบของ Gazzer เป็นศูนย์จริง ๆ ในเรื่องนี้ ทุกอย่างเดือดลงไปที่การตั้งค่าauth_socket/unix_socket

ดังนั้นเมื่อใช้ MariaDB 5.5 (ภายใต้ Ubuntu 14.04) และ MariaDB 10 ภายใต้ (Ubuntu 16.04) ให้เข้าสู่ระบบ MySQL และเรียกใช้คำสั่งนี้ล้างสิ่งต่าง ๆ ทันที:

UPDATE mysql.user SET plugin='' WHERE User='root';
FLUSH PRIVILEGES;

คำตอบอื่น ๆ - รวมถึงคำตอบที่ได้รับคะแนนโหวตสูงสุดจากโพสต์นี้โดย Loremhipsum - กระตุ้นให้เกิดการปฏิบัติที่ไม่ดีโดยแนะนำให้ลดผู้ใช้แล้วสร้างใหม่ สำหรับฉันนั่นเป็นวิธีแก้ปัญหาที่ค่อนข้างรุนแรง ทางออกที่ดีที่สุด / ง่ายที่สุดในระบบปฏิบัติการเพื่อทำให้pluginค่าเป็นโมฆะล้างสิทธิ์และรับชีวิต


-1

ฉันมีปัญหาเดียวกันและใช้งานต่อไปนี้แก้ไข:

mysql_upgrade --force

น่าเศร้าที่ไม่ได้ผล ฉันกำลังติดตั้ง Ubuntu ใหม่
codescope

1
ฉันเพิ่งติดตั้ง Ubuntu 16.04 ใหม่และติดตั้งเซิร์ฟเวอร์ mariad หลังจากติดตั้งฉันรัน mysql_secure_installation และตั้งรหัสผ่าน หลังจากผ่านขั้นตอนที่เหลือใน mysql_secure_installation ฉันก็วิ่งอีกครั้งและดูเหมือนว่ามันจะไม่บันทึกการเปลี่ยนแปลง ฉันยังไม่สามารถเข้าสู่ระบบจากบัญชีผู้ใช้ปกติของฉัน มันอาจเป็นข้อบกพร่องหรือไม่?
codescope

สิ่งนี้จะไม่ช่วย ปัญหาไม่เกี่ยวข้องกับการติดตั้งจริงของไบนารี MariaDB แต่ผู้ใช้ที่rootถูกตั้งค่าด้วยpluginการตั้งค่าที่ไม่ได้มาตรฐาน เคสแบบขอบเท่านั้นที่การอัพเกรดฐานข้อมูลอาจช่วยได้ในกรณีเช่นนี้คือถ้าmysql_upgradeกระบวนการนั้นคำนึงถึงpluginการตั้งค่าที่ฉันสงสัย
JakeGould
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.