เปิดใช้งานการเชื่อมต่อ MySQL ระยะไกล: ข้อผิดพลาด 1045 (28000): การเข้าถึงถูกปฏิเสธสำหรับผู้ใช้


136

MySQL 5.1.31 ทำงานบน Windows XP

จากเซิร์ฟเวอร์ MySQL ภายใน (192.168.233.142) ฉันสามารถเชื่อมต่อในฐานะรูทได้ดังนี้:

>mysql --host=192.168.233.142 --user=root --password=redacted

จากเครื่องระยะไกล (192.168.233.163) ฉันเห็นว่าพอร์ต mysql เปิดอยู่:

# telnet 192.168.233.142 3306
Trying 192.168.233.142...
Connected to 192.168.233.142 (192.168.233.142).

แต่เมื่อพยายามเชื่อมต่อกับ mysql จากเครื่องระยะไกลฉันได้รับ:

# mysql --host=192.168.233.142 --user=root --password=redacted
ERROR 1045 (28000): Access denied for user 'root'@'192.168.233.163' (using password: YES)

ฉันมีเพียง 2 รายการใน mysql.user:

Host         User     Password
--------------------------------------
localhost    root     *blahblahblah
%            root     [same as above]

ฉันต้องทำอะไรอีกบ้างเพื่อเปิดใช้งานการเข้าถึงระยะไกล

แก้ไข

ตามที่ Paulo แนะนำด้านล่างนี้ฉันได้ลองแทนที่รายการ mysql.user สำหรับ% ด้วยรายการเฉพาะ IP ดังนั้นตารางผู้ใช้ของฉันจึงมีลักษณะดังนี้:

Host             User     Password
------------------------------------------
localhost        root     *blahblahblah
192.168.233.163  root     [same as above]

จากนั้นฉันทำการรีสตาร์ทเครื่อง แต่ปัญหายังคงมีอยู่

คำตอบ:


213

คุณต้องใส่สิ่งนี้เป็นรูท:

GRANT ALL PRIVILEGES ON *.* TO 'USERNAME'@'IP' IDENTIFIED BY 'PASSWORD' with grant option;

;

โดยที่ IP คือ IP ที่คุณต้องการอนุญาตให้เข้าถึง USERNAME คือผู้ใช้ที่คุณใช้ในการเชื่อมต่อและ PASSWORD คือรหัสผ่านที่เกี่ยวข้อง

หากคุณต้องการอนุญาตการเข้าถึงจาก IP ใด ๆ ให้ใส่%แทน IP ของคุณ

จากนั้นคุณจะต้องใส่เท่านั้น

FLUSH PRIVILEGES;

หรือรีสตาร์ทเซิร์ฟเวอร์ mysql เท่านี้ก็เสร็จเรียบร้อย


มีวิธีใดบ้างที่จะทำสิ่งนี้โดยไม่มีไคลเอนต์ mysql ในพื้นที่?
cmcginty

จะลบสิทธิพิเศษของ ip เฉพาะได้อย่างไร?
Umair ยับ

4
stackoverflow.com/a/21151255/470749ช่วยฉันด้วยเพราะฉันเดาว่าการตั้งค่าการผูกที่อยู่ของฉันจำเป็นต้องแสดงความคิดเห็น การให้สิทธิ์ระยะไกลไม่เพียงพอที่จะทำให้ใช้งานได้
Ryan

8
ไม่ได้อธิบายไว้ในคำตอบ แต่แทนที่PASSWORDด้วยรหัสผ่านบัญชี ฉันพยายามดังกล่าวข้างต้นมีการเปลี่ยนแปลงเพียงUSERNAMEและและมันไม่ได้ทำงานสำหรับฉันจนกว่าฉันจะเปลี่ยนIP PASSWORD
Richard Parnaby-King

หลังจากทำสิ่งนี้แล้วให้ทำตามสิ่งที่กล่าวไว้ในคำตอบต่อไปนี้ด้วย: stackoverflow.com/a/21151255/445438
budhajeewa

85

ฉันได้รับข้อผิดพลาดเดียวกันหลังจากให้สิทธิ์การเข้าถึงระยะไกลจนกระทั่งฉันทำสิ่งนี้:

จาก /etc/mysql/my.cnf

ใน mysql เวอร์ชันใหม่กว่าตำแหน่งของไฟล์คือ /etc/mysql/mysql.conf.d/mysqld.cnf

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address           = 127.0.0.1

(แสดงความคิดเห็นบรรทัดนี้bind-address = 127.0.0.1)

service mysql restartจากนั้นเรียก


6
หรือเปลี่ยนเป็น bind-address = 0.0.0.0
lolski

2
การแสดงความคิดเห็นอย่างเดียวbind-addressไม่ได้ผลสำหรับฉัน อย่างใดอย่างหนึ่งbind-address = 0.0.0.0หรือbind-address = <server_ip>ทำงาน
chhantyal

58

โดยค่าเริ่มต้นในการเข้าถึงระยะไกลเซิร์ฟเวอร์ MySQL จะถูกปิดใช้งาน กระบวนการในการให้การเข้าถึงระยะไกลแก่ผู้ใช้คือ

  1. ไปที่โฟลเดอร์ sql bin ของฉันหรือเพิ่มลงใน PATH
  2. เข้าสู่ระบบเพื่อรูทโดยmysql -uroot -proot(หรือรหัสผ่านรูทคืออะไรก็ได้)
  3. เมื่อประสบความสำเร็จคุณจะได้รับ mysql>
  4. ให้สิทธิ์การเข้าถึงทั้งหมดสำหรับผู้ใช้นั้น

GRANT ALL PRIVILEGES ON *.* TO 'username'@'IP' IDENTIFIED BY 'password';

ที่นี่ IP คือที่อยู่ IP ที่คุณต้องการอนุญาตการเข้าถึงระยะไกลหากเราใส่%ที่อยู่ IP ใด ๆ ก็สามารถเข้าถึงได้จากระยะไกล

ตัวอย่าง:

C:\Users\UserName> cd C:\Program Files (x86)\MySQL\MySQL Server 5.0\bin

C:\Program Files (x86)\MySQL\MySQL Server 5.0\bin>mysql -uroot -proot

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root';
Query OK, 0 rows affected (0.27 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.25 sec)

สำหรับผู้ใช้รายอื่น

mysql> GRANT ALL PRIVILEGES ON *.* TO 'testUser'@'%' IDENTIFIED BY 'testUser';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

หวังว่านี่จะช่วยได้


+1 สำหรับรายละเอียดที่ยอดเยี่ยมมันช่วยให้ฉันเห็นว่า0 rows affectedเป็นบรรทัดฐาน :) นอกจากนี้service mysqld restartขอแนะนำในตอนท้าย [ mysqldเป็นบางครั้งmysql]
Nathan Dortman

# หมายเหตุ: สำหรับเวอร์ชัน 5.6+ ให้ใช้ "ให้สิทธิ์ทั้งหมดใน ... " (ไม่มีสิทธิ์)
Nicke Manarin

21

ความช่วยเหลือของ Paulo นำฉันไปสู่การแก้ปัญหา มันเป็นการรวมกันของสิ่งต่อไปนี้:

  • รหัสผ่านมีเครื่องหมายดอลลาร์
  • ฉันพยายามเชื่อมต่อจากเชลล์ลินุกซ์

bash shell ถือว่าเครื่องหมายดอลลาร์เป็นอักขระพิเศษสำหรับการขยายไปยังตัวแปรสภาพแวดล้อมดังนั้นเราจำเป็นต้องหลีกเลี่ยงด้วยแบ็กสแลช บังเอิญเราไม่จำเป็นต้องทำเช่นนี้ในกรณีที่เครื่องหมายดอลลาร์เป็นอักขระสุดท้ายของรหัสผ่าน

ตัวอย่างเช่นหากรหัสผ่านของคุณคือ "pas $ word" จาก Linux bash เราจะต้องเชื่อมต่อดังนี้:

# mysql --host=192.168.233.142 --user=root --password=pas\$word

4
นอกเหนือจากข้างต้นโปรดตรวจสอบ /etc/mysql/my.cnf และแสดงความคิดเห็นที่ผูกมัด = 127.0.0.1
Buminda

2
หรืออีกวิธีหนึ่งสามารถใช้เครื่องหมายคำพูดเดี่ยวเพื่อป้องกันการขยายตัวของ $: mysql --host=192.168.233.142 --user=root --password='pas$word' stackoverflow.com/a/6697781/500942
jalanb

'$' ในรหัสผ่าน ล้ำค่า. ขอบคุณมาก !!
Nagendra Kakarla

หลังจากเอาหัวชนจอมอนิเตอร์สักพักฉันก็เจอสิ่งนี้และมันได้ผล ฉันมี! และ @ ในรหัสผ่านของฉันเปลี่ยนรหัสผ่านสิทธิ์ล้างและฉันกลับมาที่มัน ขอบคุณ!
AJM

9

คุณมีไฟร์วอลล์หรือไม่? ตรวจสอบให้แน่ใจว่าพอร์ต 3306 เปิดอยู่

บน windows โดยค่าเริ่มต้นบัญชี root mysql จะถูกสร้างขึ้นซึ่งได้รับอนุญาตให้เข้าถึงจาก localhost เท่านั้นเว้นแต่คุณจะเลือกตัวเลือกเพื่อเปิดใช้งานการเข้าถึงจากเครื่องระยะไกลระหว่างการติดตั้ง

สร้างหรืออัปเดตผู้ใช้ที่ต้องการโดยใช้ "%" เป็นชื่อโฮสต์

ตัวอย่าง:

CREATE USER 'krish'@'%' IDENTIFIED BY 'password';

6
เซิร์ฟเวอร์ตอบกลับด้วย "ERROR 1045 (28000): การเข้าถึงถูกปฏิเสธสำหรับ" ... ถ้าบล็อกไฟร์วอลล์จะหมดเวลา ...
Paulo H.

แค่อยากจะโพสต์ครั้งแรก my bad
Vamsi Krishna B

@Krish - ทุกสิ่งที่คุณแนะนำมีอยู่ในคำถามแล้ว
Mike Chamberlain

5
  1. ลองflush privilegesอีกครั้ง

  2. ลองรีสตาร์ทเซิร์ฟเวอร์เพื่อโหลดเงินช่วยเหลืออีกครั้ง

  3. ลองสร้างผู้ใช้ด้วยโฮสต์ "192.168.233.163" ดูเหมือนว่า "%" จะไม่อนุญาตทั้งหมด (มันแปลก)


ขอบคุณฉันลองแล้ว แต่ก็ไม่มีประโยชน์ ฉันอัปเดตคำถามพร้อมคำแนะนำของคุณ
Mike Chamberlain

4
ลองสร้างผู้ใช้รายอื่นและอย่าลืมตั้งค่าการให้สิทธิ์ทั้งหมด:CREATE USER 'monty'@'%' IDENTIFIED BY 'some_pass'; GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%' WITH GRANT OPTION;
Paulo H.

4

ในกรณีของฉันฉันพยายามเชื่อมต่อกับเซิร์ฟเวอร์ mysql ระยะไกลบนระบบปฏิบัติการ cent หลังจากดำเนินการแก้ไขปัญหามากมาย (ให้สิทธิ์ทั้งหมดลบการผูก IP เปิดใช้งานเครือข่าย) ปัญหาก็ยังไม่ได้รับการแก้ไข

เมื่อปรากฎว่าในขณะที่มองหาโซลูชันต่างๆฉันเจอ iptables ซึ่งทำให้ฉันรู้ว่า mysql port 3306 ไม่ยอมรับการเชื่อมต่อ

นี่คือบันทึกเล็ก ๆ เกี่ยวกับวิธีที่ฉันตรวจสอบและแก้ไขปัญหานี้

  • ตรวจสอบว่าพอร์ตยอมรับการเชื่อมต่อหรือไม่:

    telnet (mysql เซิร์ฟเวอร์ ip) [portNo]

  • การเพิ่มกฎตาราง ip เพื่ออนุญาตการเชื่อมต่อบนพอร์ต:

    iptables -A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ยอมรับ

  • ไม่แนะนำสิ่งนี้สำหรับสภาพแวดล้อมการใช้งานจริง แต่หาก iptables ของคุณไม่ได้รับการกำหนดค่าอย่างถูกต้องการเพิ่มกฎอาจยังไม่สามารถแก้ปัญหาได้ ในกรณีนี้ควรทำดังนี้:

    iptables บริการหยุด

หวังว่านี่จะช่วยได้


3

หากคุณใช้ไดนามิก ip เพียงแค่ให้สิทธิ์การเข้าถึง 192.168.2% ดังนั้นตอนนี้คุณไม่ต้องกังวลกับการให้สิทธิ์การเข้าถึงที่อยู่ IP ของคุณทุกครั้ง


1

ฉันมีปัญหากับการล็อกอินระยะไกลไปยัง MYSQL สำหรับอินสแตนซ์ Amazon EC2 Linux ของฉัน พบวิธีแก้ไขเพื่อให้แน่ใจว่ากลุ่มความปลอดภัยของฉันรวมกฎขาเข้าสำหรับ MySQL พอร์ต 3306 เพื่อรวมที่อยู่ IP ของฉัน (หรือ 0.0.0.0/0 สำหรับทุกที่) สามารถเชื่อมต่อจากระยะไกลได้ทันทีที่ฉันเพิ่มกฎนี้



0

MySQL ODBC 3.51 Driver คืออักขระพิเศษในรหัสผ่านไม่ได้รับการจัดการ

"คำเตือน - คุณอาจปวดหัวอย่างหนักกับ MySQL ODBC 3.51 หากรหัสผ่านในคำสั่ง GRANT ของคุณมีอักขระพิเศษเช่น! @ # $% ^? MySQL ODBC 3.51 ODBC Driver ไม่รองรับอักขระพิเศษเหล่านี้ในช่องรหัสผ่าน ข้อความแสดงข้อผิดพลาดเดียวที่คุณจะได้รับคือ“ การเข้าถึงถูกปฏิเสธ” (โดยใช้รหัสผ่าน: ใช่) "- จากhttp://www.plaintutorials.com/install-and-create-mysql-odbc-connector-on-windows-7/


0

อาจมีการสร้างชุดผู้ใช้ / โฮสต์โดยไม่ใช้รหัสผ่าน

ฉันสมมติว่าเมื่อเพิ่มโฮสต์ใหม่สำหรับผู้ใช้ที่มีอยู่ (โดยใช้แอป GUI) รหัสผ่านที่มีอยู่จะถูกใช้สำหรับชุดค่าผสมของผู้ใช้ / โฮสต์ใหม่

ฉันสามารถเข้าสู่ระบบด้วย

mysql -u username -p PASSWORD

ในเครื่อง แต่ไม่ใช่จาก IPADDRESS ด้วย

mysql -u --host=HOST -p PASSWORD

(ฉันสามารถเข้าสู่ระบบจาก IPADDRESS ได้โดยไม่ต้องใช้รหัสผ่าน)

mysql -u --host=HOST

การตั้งรหัสผ่านที่อนุญาตให้เข้าถึง:

set password for '<USER>'@'<IPADDRESS>' = '<PASSWORD>';

1
ขอบคุณฉันใช้เวลาส่วนใหญ่ในการพยายามเชื่อมต่อกับเซิร์ฟเวอร์ Mysql จากระยะไกลและบรรทัดนี้ช่วยได้มาก เมื่อตั้งรหัสผ่านของผู้ใช้ฉันพบข้อผิดพลาดERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal numberซึ่งนำฉันไปสู่บทความนี้: knowmysql.blogspot.com/2013/09/…หลังจากทำตามขั้นตอนเหล่านั้นในที่สุดฉันก็สามารถเชื่อมต่อกับเซิร์ฟเวอร์ได้
Andy Forceno
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.