เปลี่ยนรหัสผ่านผู้ใช้ MySQL: คำสั่ง ALTER USER (MySQL 5.7 / 8.0) + การกู้คืนรหัสผ่าน Root

目次

1. [Quick Answer] รายการคำสั่งเปลี่ยนรหัสผ่านผู้ใช้ MySQL (วิธีที่เร็วที่สุด)

คำสั่งพื้นฐานในการเปลี่ยนรหัสผ่านของผู้ใช้ใน MySQL คือ ALTER USER.
วิธีนี้แนะนำให้ใช้ใน MySQL 5.7 ขึ้นไป และใช้ใน MySQL 8.0 ด้วยเช่นเดียวกัน.

1.1 ไวยากรณ์พื้นฐาน (ที่ใช้บ่อยที่สุด)

ALTER USER 'username'@'localhost' IDENTIFIED BY 'newpassword';
  • username : ชื่อผู้ใช้เป้าหมายที่ต้องการอัปเดต
  • localhost : โฮสต์ของไคลเอนต์ (บัญชี MySQL จะระบุด้วย “ชื่อผู้ใช้ + โฮสต์”)
  • newpassword : รหัสผ่านใหม่

หลังจากดำเนินการ การเปลี่ยนแปลงจะมีผลทันที ในหลายกรณีไม่จำเป็นต้องใช้ FLUSH PRIVILEGES; (ALTER USER จะอัปเดตตารางสิทธิ์โดยอัตโนมัติ).

ข้อผิดพลาดทั่วไป

  • แม้จะใช้ชื่อผู้ใช้เดียวกัน @'localhost' และ @'%' จะถือเป็นบัญชีที่แตกต่างกัน
  • สัญลักษณ์ในรหัสผ่านต้องอยู่ในเครื่องหมายอัญประกาศเดี่ยว

1.2 การเปลี่ยนผู้ใช้ที่เข้าถึงจากระยะไกล (%)

ALTER USER 'username'@'%' IDENTIFIED BY 'newpassword';

% หมายถึง “โฮสต์ใดก็ได้”.
มักใช้ในสภาพแวดล้อมคลาวด์หรือสำหรับผู้ใช้ที่อนุญาตให้เชื่อมต่อจากภายนอก.

หมายเหตุ

  • ควรตรวจสอบล่วงหน้าด้วยคำสั่ง SELECT User, Host FROM mysql.user;
  • หากคุณเปลี่ยนรหัสผ่านสำหรับโฮสต์ที่ผิด คุณจะไม่สามารถเข้าสู่ระบบได้

1.3 เปลี่ยนรหัสผ่านพร้อมระบุปลั๊กอินการตรวจสอบสิทธิ์ (สำคัญใน 8.0)

ใน MySQL 8.0 ปลั๊กอินการตรวจสอบสิทธิ์เริ่มต้นคือ caching_sha2_password.
หากคุณไม่สามารถเชื่อมต่อด้วยไคลเอนต์เก่า ให้ตั้งค่าปลั๊กอินอย่างชัดเจน.

ALTER USER 'username'@'localhost'
IDENTIFIED WITH mysql_native_password
BY 'newpassword';
  • mysql_native_password : วิธีเดิม (ให้ความสำคัญกับความเข้ากันได้)
  • caching_sha2_password : มาตรฐาน MySQL 8.0 (แนะนำ)

ข้อผิดพลาดทั่วไป

  • PHP หรือไคลเอนต์เก่าอาจไม่รองรับปลั๊กอินเริ่มต้นของ MySQL 8.0
  • ตัดสินใจว่า “ฉันไม่สามารถเข้าสู่ระบบ” โดยไม่ได้ตรวจสอบปลั๊กอินการตรวจสอบสิทธิ์

1.4 หากคุณได้รับข้อผิดพลาดเรื่องสิทธิ์

ตัวอย่างข้อผิดพลาด:

ERROR 1227 (42000): Access denied; you need (at least one of) the SYSTEM_USER privilege(s)

ในกรณีนี้ ผู้ใช้ที่เข้าสู่ระบบอยู่ในขณะนี้ไม่มีสิทธิ์ทำการเปลี่ยนแปลง.

ตรวจสอบ:

SHOW GRANTS FOR CURRENT_USER();

เรียกใช้คำสั่งในฐานะ root หรือผู้ใช้ที่มีสิทธิ์เพียงพอ.

1.5 วิธีตรวจสอบหลังจากการเปลี่ยนแปลง

SELECT User, Host, plugin FROM mysql.user WHERE User='username';
  • ตรวจสอบปลั๊กอินการตรวจสอบสิทธิ์ผ่านคอลัมน์ plugin
  • วิธีตรวจสอบที่เชื่อถือได้ที่สุดคือการเข้าสู่ระบบจริงและยืนยันการเชื่อมต่อ

1.6 สิ่งที่เกิดขึ้นกับเซสชันที่มีอยู่

หลังจากเปลี่ยนรหัสผ่าน:

  • การเชื่อมต่อใหม่ต้องใช้รหัสผ่านใหม่
  • เซสชันที่มีอยู่อาจถูกตัดการเชื่อมต่อทันที ขึ้นอยู่กับสภาพแวดล้อม
  • ในการผลิต แนะนำให้ทำการเปลี่ยนแปลงนอกชั่วโมงทำการ

2. พื้นฐานผู้ใช้และโฮสต์ MySQL (ป้องกันปัญหา “ติดขัด” ที่พบบ่อย)

ใน MySQL ผู้ใช้ไม่ได้ระบุด้วยเพียง “ชื่อผู้ใช้” เท่านั้น แต่ระบุด้วย การผสมผสานของ “ชื่อผู้ใช้ + โฮสต์ของไคลเอนต์ (Host)”.
หากคุณไม่เข้าใจสิ่งนี้ คุณอาจเจอปัญหาแบบคลาสสิก: “ฉันเปลี่ยนรหัสผ่านแล้วแต่ยังไม่สามารถเข้าสู่ระบบได้.”

2.1 ผู้ใช้คือคู่ “user@host”

ตัวอย่าง:

  • 'appuser'@'localhost'
  • 'appuser'@'%'
  • 'appuser'@'192.168.1.%'

เหล่านี้ ทั้งหมดถือเป็นบัญชีที่แตกต่างกัน.
ดังนั้นแม้ว่าคุณจะเปลี่ยนรหัสผ่านสำหรับ localhost ก็ไม่ส่งผลต่อบัญชี %.

คำสั่งตรวจสอบ:

SELECT User, Host FROM mysql.user ORDER BY User, Host;

ข้อผิดพลาดทั่วไป

  • ไม่ตระหนักว่ามีหลายบัญชีที่ใช้ชื่อผู้ใช้เดียวกัน
  • คุณเปลี่ยนรหัสผ่านสำหรับ localhost แต่คุณกำลังเข้าสู่ระบบผ่าน TCP (127.0.0.1)

2.2 localhost และ 127.0.0.1 ถูกจัดการแตกต่างกัน

ใน MySQL:

  • localhost → การเชื่อมต่อผ่าน UNIX socket (การเชื่อมต่อภายในเครื่อง)
  • 127.0.0.1 → การเชื่อมต่อ TCP/IP

ขึ้นอยู่กับสภาพแวดล้อม บัญชีที่แตกต่างกันอาจตรงกัน.

ตรวจสอบ:

mysql -u username -p -h 127.0.0.1

If you can’t log in with the above, the @'127.0.0.1' account may not exist.

2.3 ตรวจสอบผู้ใช้ที่ได้รับการรับรองในปัจจุบัน

It’s important to understand “which account you are authenticated as.”

SELECT CURRENT_USER();

This displays the “user@host” that was actually authenticated.

SELECT USER(); shows the connection request information, so it may not match.

2.4 ตรวจสอบสิทธิ์ (SHOW GRANTS)

If you can’t change a password, insufficient privileges may be the cause.

SHOW GRANTS FOR 'username'@'host';

Or for the currently logged-in user:

SHOW GRANTS FOR CURRENT_USER();

Minimum required privileges

  • ALTER USER
  • หรือ SYSTEM_USER (MySQL 8.0 ขึ้นไป)

2.5 รูปแบบความล้มเหลวทั่วไป

  1. คุณเปลี่ยนรหัสผ่านสำหรับ Host ที่ผิด
  2. ปลั๊กอินการรับรองตัวตนแตกต่างกัน (พบได้บ่อยใน 8.0)
  3. บัญชีเป้าหมายไม่มีอยู่ตั้งแต่แรก

Check whether the user exists:

SELECT User, Host FROM mysql.user WHERE User='username';

Once you understand this model, you can avoid most password-change related problems.

3. ขั้นตอนที่แนะนำ: เปลี่ยนอย่างปลอดภัยด้วย ALTER USER (ใช้ได้กับ MySQL 8.0 / 5.7)

In MySQL 5.7 and later, changing passwords with ALTER USER is the standard and recommended approach.
Direct updates like UPDATE mysql.user can behave differently depending on the version and carry future compatibility risks, so it’s best to avoid them.

3.1 การตรวจสอบล่วงหน้า (ยืนยันเสมอก่อนทำการเปลี่ยน)

Before changing a password, confirm these three items.

① ยืนยันผู้ใช้และ Host เป้าหมาย

SELECT User, Host FROM mysql.user WHERE User='username';
  • ตรวจสอบว่ามีหลายบัญชีที่ใช้ชื่อผู้ใช้เดียวกันหรือไม่
  • อย่าสับสน localhost กับ %

② ยืนยันปลั๊กอินการรับรองตัวตนปัจจุบัน (สำคัญใน 8.0)

SELECT User, Host, plugin
FROM mysql.user
WHERE User='username';
  • caching_sha2_password (มาตรฐาน MySQL 8.0)
  • mysql_native_password (ปลั๊กอินเก่า)

Some connection failures are caused by the authentication plugin.

③ ยืนยันผู้ใช้ที่ได้รับการรับรองในปัจจุบัน

SELECT CURRENT_USER();

To avoid privilege errors, run the commands as root or as a user with appropriate privileges.

3.2 รัน ALTER USER (รูปแบบมาตรฐาน)

ALTER USER 'username'@'localhost'
IDENTIFIED BY 'NewStrongPassword123!';

The change takes effect immediately.
In most cases, FLUSH PRIVILEGES; is not required.

หมายเหตุ

  • หากนโยบายรหัสผ่าน ( validate_password ) ถูกละเมิด อาจเกิด ERROR 1819
  • หากรหัสผ่านมีอักขระพิเศษ ควรใส่ในเครื่องหมายอัญประกาศเดี่ยวเสมอ

3.3 เปลี่ยนพร้อมระบุปลั๊กอินการรับรองตัวตน (เฉพาะเมื่อจำเป็น)

If you are using older clients in a MySQL 8.0 environment:

ALTER USER 'username'@'localhost'
IDENTIFIED WITH mysql_native_password
BY 'NewStrongPassword123!';

Cases where you should change it:

  • ไม่สามารถเชื่อมต่อด้วย PHP หรือไคลเอนต์ MySQL รุ่นเก่า
  • สภาพแวดล้อมที่ไม่รองรับ caching_sha2_password

Cases where you should NOT change it:

  • หากคุณสามารถเชื่อมต่อได้โดยไม่มีปัญหาในสภาพแวดล้อมสมัยใหม่ (ปลั๊กอินมาตรฐานปลอดภัยกว่า)

3.4 การตรวจสอบหลังการเปลี่ยน

① ตรวจสอบปลั๊กอินการรับรองตัวตน

SELECT User, Host, plugin
FROM mysql.user
WHERE User='username';

② ตรวจสอบโดยการเข้าสู่ระบบจริง

mysql -u username -p

Always test that you can log in.

3.5 ผลกระทบต่อเซสชันที่มีอยู่

After changing a password:

  • การเชื่อมต่อใหม่ → ต้องใช้รหัสผ่านใหม่
  • การเชื่อมต่อที่มีอยู่ → อาจยังคงทำงานได้ขึ้นอยู่กับสภาพแวดล้อม
  • การใช้งานจริง → อาจต้องรีสตาร์ทการเชื่อมต่อของแอปพลิเคชัน

ข้อผิดพลาดทั่วไป

  • ไม่อัปเดตข้อมูลรับรองการเชื่อมต่อของแอปพลิเคชัน
  • รหัสผ่านเก่ายังคงอยู่ในไฟล์กำหนดค่า

3.6 เคล็ดลับการดำเนินงานที่ปลอดภัยสำหรับการผลิต

  • ทำการเปลี่ยนแปลงนอกเวลาทำการ
  • ตรวจสอบไฟล์การกำหนดค่าของแอปพลิเคชันล่วงหน้า
  • ทำงานโดยไม่ต้องตัดการเชื่อมต่อเซสชัน SSH ของคุณ
  • เมื่อเปลี่ยนรหัส root ให้แน่ใจว่าคุณมีวิธีการกู้คืนพร้อมใช้งาน

4. ความแตกต่างระหว่าง MySQL 8.0 และ 5.7

สาเหตุหลักของปัญหาเมื่อเปลี่ยนรหัสผ่าน MySQL คือ ความแตกต่างของวิธีการตรวจสอบตัวตนระหว่าง MySQL 8.0 และ 5.7.
โดยเฉพาะอย่างยิ่งหลายกรณีที่ “ฉันเปลี่ยนแล้วแต่ไม่สามารถเข้าสู่ระบบได้” เกิดจากความแตกต่างของปลั๊กอินการตรวจสอบตัวตน.

Diagram showing the difference between MySQL 5.7 mysql_native_password and MySQL 8.0 caching_sha2_password authentication methods

ความแตกต่างของการตรวจสอบตัวตนระหว่าง MySQL 5.7 และ MySQL 8.0

4.1 ความแตกต่างของปลั๊กอินการตรวจสอบตัวตนเริ่มต้น

VersionDefault authentication plugin
MySQL 5.7mysql_native_password
MySQL 8.0caching_sha2_password

ใน MySQL 8.0, caching_sha2_password กลายเป็นมาตรฐานสำหรับความปลอดภัยที่แข็งแกร่งขึ้น.
อย่างไรก็ตาม ไคลเอนต์รุ่นเก่า (เวอร์ชัน PHP เก่า, ตัวเชื่อมต่อ MySQL เก่า, เป็นต้น) อาจไม่รองรับมัน.

วิธีตรวจสอบ:

SELECT User, Host, plugin
FROM mysql.user
WHERE User='username';

ปัญหาทั่วไป

  • ไคลเอนต์รุ่นเก่าไม่สามารถเชื่อมต่อกับผู้ใช้ที่สร้างบน MySQL 8.0
  • แม้ว่าจะเกิดข้อผิดพลาด คุณอาจไม่ตระหนักว่าต้นเหตุคือปลั๊กอินการตรวจสอบตัวตน

4.2 วิธีสลับปลั๊กอินการตรวจสอบตัวตนเพื่อความเข้ากันได้

เฉพาะเมื่อคุณต้องเชื่อมต่อจากสภาพแวดล้อมเก่า ให้เปลี่ยนตามนี้:

ALTER USER 'username'@'localhost'
IDENTIFIED WITH mysql_native_password
BY 'NewStrongPassword123!';

หลังจากเปลี่ยนแล้ว ให้รันการทดสอบการเชื่อมต่อเสมอ.

หมายเหตุ

  • จากมุมมองด้านความปลอดภัย, caching_sha2_password ปลอดภัยกว่า
  • อย่าสลับไปใช้ปลั๊กอินเก่าโดยไม่จำเป็น
  • หากเป็นไปได้ การอัปเดตด้านไคลเอนต์เป็นทางเลือกที่ดีกว่า

4.3 ไม่แนะนำให้ใช้ UPDATE โดยตรง

ใน MySQL 5.7 และก่อนหน้า มีการใช้วิธีเช่นต่อไปนี้:

UPDATE mysql.user
SET authentication_string=PASSWORD('newpassword')
WHERE User='username';
FLUSH PRIVILEGES;

อย่างไรก็ตาม วิธีนี้เป็น:

  • พึ่งพาเวอร์ชันอย่างมาก
  • อยู่ภายใต้การเปลี่ยนแปลงสเปคใน 8.0
  • มีแนวโน้มว่าจะถูกยกเลิกในอนาคต

หลักการทั่วไป: ใช้ ALTER USER

4.4 ความแตกต่างของพฤติกรรมปลั๊กอิน validate_password

ใน MySQL 5.7 และ 8.0, ฟีเจอร์นโยบายรหัสผ่าน (การตรวจสอบความแข็งแรง) มีให้โดยค่าเริ่มต้น.

ตรวจสอบ:

SHOW VARIABLES LIKE 'validate_password%';

หากคุณละเมิดนโยบาย คุณอาจได้รับ:

ERROR 1819 (HY000)

.

เนื่องจากหลายสภาพแวดล้อมของ 8.0 บังคับใช้ฐานความปลอดภัยที่เข้มงวดกว่า,
หลังจากอัปเกรดจาก 5.7, คุณอาจพบว่าการเปลี่ยนรหัสผ่านไม่ผ่านอีกต่อไปเนื่องจากข้อกำหนดนโยบายที่เข้มงวดขึ้น.

4.5 วิธีตรวจสอบเวอร์ชันของคุณ

หากคุณไม่แน่ใจว่าใช้งานเวอร์ชันใด:

SELECT VERSION();

หากคุณทำการแก้ไขโดยไม่ได้ยืนยันเวอร์ชัน คุณอาจใช้วิธีที่ไม่ถูกต้อง

5. การกู้คืนรหัส root ที่ลืม (ขั้นตอนที่เน้นความปลอดภัย)

หากคุณลืมรหัสผ่านของผู้ใช้ MySQL root (ผู้ดูแลระบบ) คุณจะไม่สามารถเข้าสู่ระบบได้ตามปกติ.
ในกรณีนี้ คุณต้อง ปิดการใช้งานตาราง grant ชั่วคราวและรีเซ็ตรหัสผ่าน. อย่างไรก็ตาม ขั้นตอนนี้มีความเสี่ยงด้านความปลอดภัย ดังนั้นให้ทำตามขั้นตอนอย่างระมัดระวัง.

5.1 ยืนยันว่าคุณจำเป็นต้องใช้รหัส root จริงหรือไม่

แรกสุด ตรวจสอบสิ่งต่อไปนี้:

  • คุณมีสิทธิ์ sudo ระดับ OS หรือไม่
  • การตรวจสอบ auth_socket ถูกเปิดใช้งานหรือไม่ (ทั่วไปในระบบที่ใช้ Ubuntu)

ตัวอย่างการตรวจสอบ:

SELECT User, Host, plugin
FROM mysql.user
WHERE User='root';

หาก plugin เป็น auth_socket คุณอาจสามารถเข้าสู่ระบบในฐานะผู้ใช้ root ของ OS ได้.

sudo mysql

หากวิธีนี้ทำงาน คุณเพียงแค่ต้องรีเซ็ตรหัสผ่าน.

5.2 กระบวนการกู้คืน (ขั้นตอนทั่วไป)

① หยุดเซิร์ฟเวอร์ MySQL

sudo systemctl stop mysql

② เริ่มต้นโดยปิดการใช้งานตาราง grant

sudo mysqld_safe --skip-grant-tables &

--skip-grant-tables ปิดการตรวจสอบตัวตน.
ในสถานะนี้ ใครก็สามารถเชื่อมต่อได้ ดังนั้นให้ทำขั้นตอนให้เสร็จเร็วที่สุด.

③ เชื่อมต่อไปยัง MySQL

mysql -u root

คุณสามารถเชื่อมต่อโดยไม่ต้องใช้รหัสผ่าน.

④ รีเซ็ตรหัส root (วิธีแนะนำ)

ALTER USER 'root'@'localhost'
IDENTIFIED BY 'NewStrongPassword123!';

สำคัญ

  • อย่าใช้ UPDATE mysql.user โดยตรง
  • ใช้ ALTER USER (เพื่อความเข้ากันได้ของเวอร์ชัน)

⑤ เปิดใช้งานตาราง grant อีกครั้ง

FLUSH PRIVILEGES;

⑥ รีสตาร์ท MySQL ในโหมดปกติ

sudo systemctl restart mysql

จากนั้นตรวจสอบการล็อกอินปกติ:

mysql -u root -p

5.3 ข้อผิดพลาดทั่วไป

  • ปล่อยให้ --skip-grant-tables เปิดอยู่ (เสี่ยงต่อความปลอดภัยอย่างรุนแรง)
  • เปลี่ยน Host ของ root โดยบังเอิญ
  • เปลี่ยนปลั๊กอินการตรวจสอบสิทธิ์อย่างไม่ถูกต้องและล็อกตัวเองออก

5.4 หมายเหตุสำหรับสภาพแวดล้อมการผลิต

  • ควรทำขั้นตอนนี้ในช่วงเวลาบำรุงรักษาบนเซิร์ฟเวอร์สาธารณะ
  • รักษาเซสชัน SSH ให้ทำงานอยู่ขณะทำงาน
  • สร้างสำเนาสำรองล่วงหน้า หากเป็นไปได้

การกู้คืนรหัสผ่าน root สามารถทำได้อย่างปลอดภัยหากดำเนินการอย่างระมัดระวัง

6. ข้อผิดพลาดทั่วไปและวิธีแก้ (จับทราฟฟิกตามข้อความข้อผิดพลาด)

ข้อผิดพลาดทั่วไปหลายอย่างเกิดขึ้นเมื่อเปลี่ยนรหัสผ่าน MySQL
ด้านล่าง เราจัดระเบียบสาเหตุและวิธีแก้ตามรหัสข้อผิดพลาดที่มักค้นหา

6.1 ERROR 1819 (Password does not meet policy requirements)

ตัวอย่างข้อผิดพลาด:

ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

สาเหตุ

รหัสผ่านไม่ผ่านการตรวจสอบความแข็งแรงที่บังคับโดยปลั๊กอิน validate_password

ตรวจสอบนโยบายปัจจุบัน

SHOW VARIABLES LIKE 'validate_password%';

การตั้งค่าที่สำคัญ:

  • validate_password.length
  • validate_password.policy
  • validate_password.mixed_case_count
  • validate_password.number_count
  • validate_password.special_char_count

วิธีแก้ ① (แนะนำ): ใช้รหัสผ่านที่แข็งแรงกว่า

  • อย่างน้อย 12 ตัวอักษร
  • รวมอักษรพิมพ์ใหญ่, พิมพ์เล็ก, ตัวเลขและสัญลักษณ์
  • หลีกเลี่ยงคำจากพจนานุกรม

วิธีแก้ ② (ผ่อนนโยบายชั่วคราว)

SET GLOBAL validate_password.policy = LOW;

หลังจากทำงานเสร็จ ควรคืนค่าการตั้งค่าเดิมกลับไป

ข้อผิดพลาดทั่วไป

  • ปล่อยให้นโยบายผ่อนคลายในสภาพแวดล้อมการผลิต
  • ละเลยว่าการเปลี่ยนการตั้งค่านี้ต้องการสิทธิ์ SUPER

6.2 ERROR 1227 (Insufficient privileges)

ตัวอย่างข้อผิดพลาด:

ERROR 1227 (42000): Access denied; you need (at least one of) the SYSTEM_USER privilege(s)

สาเหตุ

ผู้ใช้ปัจจุบันไม่มีสิทธิ์ ALTER USER หรือ SYSTEM_USER

ตรวจสอบสิทธิ์

SHOW GRANTS FOR CURRENT_USER();

วิธีแก้

รันคำสั่งในฐานะ root หรือผู้ใช้ที่มีสิทธิ์เพียงพอ

หากจำเป็น:

GRANT ALTER USER ON *.* TO 'username'@'host';
FLUSH PRIVILEGES;

หมายเหตุ

  • ใน MySQL 8.0 อาจต้องการสิทธิ์ SYSTEM_USER ด้วย
  • ปฏิบัติตามหลักการของสิทธิ์ขั้นต่ำในสภาพแวดล้อมการผลิต

6.3 ไม่สามารถล็อกอินหลังจากเปลี่ยนรหัสผ่าน

สาเหตุหลัก

  1. Host ไม่ถูกต้อง
  2. ปลั๊กอินการตรวจสอบสิทธิ์ไม่ตรงกัน
  3. ความเข้ากันไม่ได้ของไคลเอนต์
  4. การตั้งค่าการเชื่อมต่อของแอปพลิเคชันไม่ได้อัปเดต

① ตรวจสอบ Host

SELECT User, Host FROM mysql.user WHERE User='username';

② ตรวจสอบปลั๊กอินการตรวจสอบสิทธิ์

SELECT plugin FROM mysql.user WHERE User='username';

③ เปลี่ยนปลั๊กอินการตรวจสอบสิทธิ์ (หากจำเป็น)

ALTER USER 'username'@'localhost'
IDENTIFIED WITH mysql_native_password
BY 'NewStrongPassword123!';

④ ตรวจสอบการตั้งค่าแอปพลิเคชัน

  • .env
  • config.php
  • สตริงการเชื่อมต่อ (DSN)

ข้อผิดพลาดทั่วไป

  • เปลี่ยน MySQL แต่ไม่ได้อัปเดตแอปพลิเคชัน
  • ไม่รีสตาร์ทคอนเทนเนอร์ในสภาพแวดล้อม Docker

6.4 ยังสามารถล็อกอินด้วยรหัสผ่านเก่าได้หลังจากเปลี่ยน

โดยปกติ การเปลี่ยนด้วย ALTER USER จะมีผลทันที

สาเหตุที่เป็นไปได้:

  • คุณอาจเปลี่ยนบัญชี Host ที่ต่างออกไป
  • การเชื่อมต่อชี้ไปยังเซิร์ฟเวอร์อื่น (replica)
  • การแคชเซสชัน

ตรวจสอบ:

SELECT CURRENT_USER();

เป็นสิ่งสำคัญอย่างยิ่งที่จะต้องยืนยันอย่างแม่นยำทั้งเซิร์ฟเวอร์ที่เชื่อมต่อและผู้ใช้ที่ได้รับการตรวจสอบตัวตน.

7. การดำเนินงานด้านความปลอดภัย: นโยบายรหัสผ่านและแนวปฏิบัติที่ดีที่สุด

Changing a password is not a one-time task.
In real-world operations, you maintain security by combining strength enforcement, privilege design, and operational rules.

7.1 การใช้ปลั๊กอิน validate_password

MySQL provides built-in functionality to enforce password strength.

ตรวจสอบการตั้งค่าปัจจุบัน

SHOW VARIABLES LIKE 'validate_password%';

พารามิเตอร์การกำหนดค่าหลัก

  • validate_password.length (ความยาวขั้นต่ำ)
  • validate_password.policy (LOW / MEDIUM / STRONG)
  • validate_password.mixed_case_count
  • validate_password.number_count
  • validate_password.special_char_count

ตัวอย่างการกำหนดค่า (ขั้นต่ำ 12 ตัวอักษร, นโยบาย MEDIUM)

SET GLOBAL validate_password.length = 12;
SET GLOBAL validate_password.policy = MEDIUM;

หมายเหตุ

  • การเปลี่ยนแปลง GLOBAL อาจรีเซ็ตหลังจากรีสตาร์ท
  • เพื่อให้การตั้งค่าคงที่ ให้กำหนดค่าในไฟล์การกำหนดค่า ( my.cnf / my.ini )

7.2 ข้อกำหนดขั้นต่ำสำหรับรหัสผ่านที่แข็งแรง

Recommended standards in practice:

  • อย่างน้อย 12 ตัวอักษร
  • รวมอักษรพิมพ์ใหญ่, พิมพ์เล็ก, ตัวเลข, และสัญลักษณ์
  • หลีกเลี่ยงคำจากพจนานุกรม
  • อย่าใช้ซ้ำในบริการอื่น

ตัวอย่าง:

X9v!pQ4z#Lm2

ตัวอย่างที่ควรหลีกเลี่ยง

password123
mysql2025
companyname!

7.3 สำคัญกว่าการเปลี่ยนแปลงตามระยะเวลา

More important than “changing every six months” is designing under the assumption of potential credential leakage.

① แยกผู้ใช้แอปพลิเคชัน

  • อย่าใช้ root ในแอปพลิเคชัน
  • สร้างผู้ใช้ที่มีสิทธิ์น้อยที่สุด

ตัวอย่าง:

GRANT SELECT, INSERT, UPDATE ON dbname.* TO 'appuser'@'localhost';

② ลดสิทธิ์ให้น้อยที่สุด (หลักการของ Least Privilege)

Allow only necessary operations to limit potential damage.

③ ใช้การตรวจสอบและบันทึก

ตัวอย่างการตรวจสอบบันทึก:

tail -f /var/log/mysql/mysql.log

MySQL Enterprise also supports audit plugins.

7.4 เคล็ดลับการดำเนินงานสำหรับสภาพแวดล้อมการผลิต

  • ทดสอบในสเตจก่อนทำการเปลี่ยนแปลงในการผลิต
  • ติดตามประวัติการเปลี่ยนแปลง (Git หรือเอกสาร)
  • รันการทดสอบการเชื่อมต่อเสมอหลังการเปลี่ยนแปลง
  • รักษาเซสชัน SSH ของคุณให้ทำงานอยู่ขณะทำงาน

7.5 สิ่งที่คุณต้องห้ามทำเด็ดขาด

  • ใช้บัญชี root ในแอปพลิเคชัน
  • ฝังรหัสผ่านในซอร์สโค้ด
  • ปิดการทำงานของ validate_password และปล่อยให้เป็นเช่นนั้น
  • ปล่อยให้เซิร์ฟเวอร์ทำงานด้วย --skip-grant-tables

Password management is not a one-off task but part of continuous operational design.

8. คำถามที่พบบ่อย (FAQ)

8.1 ถาม: สิ่งที่จะเกิดขึ้นกับเซสชันที่ใช้งานอยู่หลังจากเปลี่ยนรหัสผ่าน?

คำตอบ In principle, new connections require the new password.
For existing sessions, they may either be terminated immediately or remain active depending on the environment and configuration.

In practice:

  • ทำการเปลี่ยนแปลงนอกชั่วโมงทำงานในสภาพแวดล้อมการผลิต
  • รีสตาร์ทแอปพลิเคชันเพื่อรีเฟรชการเชื่อมต่อ

is recommended.

8.2 ถาม: ฉันเปลี่ยนรหัสผ่านแล้วแต่ยังเข้าสู่ระบบไม่ได้

The three most common causes are:

  1. Wrong Host ( localhost vs % , etc.)
  2. Authentication plugin mismatch (very common in 8.0)
  3. Application configuration not updated

Check with:

SELECT User, Host, plugin
FROM mysql.user
WHERE User='username';

Pay special attention to the plugin column.

8.3 ถาม: ฉันสามารถอนุญาตให้ผู้ใช้เฉพาะคนเดียวเปลี่ยนรหัสผ่านได้หรือไม่?

Yes.

GRANT ALTER USER ON *.* TO 'username'@'host';
FLUSH PRIVILEGES;

In MySQL 8.0, the SYSTEM_USER privilege may also be required.

SHOW GRANTS FOR 'username'@'host';

Use this to verify privileges.

8.4 ถาม: วิธีการเดียวกันหรือไม่ใน MariaDB?

Basically, ALTER USER is available, but:

  • ปลั๊กอินการตรวจสอบความถูกต้อง
  • พฤติกรรมของนโยบายรหัสผ่าน
  • ความแตกต่างตามเวอร์ชัน

may differ depending on the environment.

Check with:

SELECT VERSION();

MySQL Community Edition ไม่ได้ให้การติดตามประวัติรหัสผ่านโดยอัตโนมัติตามค่าเริ่มต้น.

8.5 Q. ฉันสามารถตรวจสอบประวัติการเปลี่ยนรหัสผ่านได้หรือไม่?

วิธีการที่เป็นไปได้:

  • เปิดใช้งานการบันทึกการตรวจสอบ
  • ใช้การจัดการบันทึกภายนอก
  • ติดตามประวัติในเอกสารการดำเนินงาน

ตัวอย่าง:

tail -f /var/log/mysql/mysql.log

8.6 Q. ฉันสามารถกู้คืนผู้ใช้ที่ไม่ใช่ root ด้วย –skip-grant-tables ได้หรือไม่?

ใช่, แต่จะสร้างสถานะที่ อันตรายอย่างมาก.
ควรกลับสู่โหมดปกติโดยทันทีหลังจากทำขั้นตอนเสร็จสิ้น.

9. สรุป

การเปลี่ยนรหัสผ่าน MySQL อาจดูง่าย, แต่หากไม่มีความเข้าใจใน โมเดล user@host, ปลั๊กอินการตรวจสอบสิทธิ์, และการออกแบบสิทธิ์, มันอาจทำให้เกิดปัญหาได้ง่าย.

ประเด็นสำคัญจากบทความนี้คือ:

9.1 ใช้ ALTER USER เป็นวิธีมาตรฐาน

ALTER USER 'username'@'localhost'
IDENTIFIED BY 'NewStrongPassword123!';
  • วิธีมาตรฐานใน MySQL 5.7 ขึ้นไป
  • ไม่แนะนำให้ใช้ UPDATE mysql.user โดยตรง
  • FLUSH PRIVILEGES มักไม่จำเป็น

9.2 ผู้ใช้ถูกจัดการเป็น “user@host”

  • localhost และ % เป็นบัญชีที่แตกต่างกัน
  • อาจมีหลายบัญชีที่ใช้ชื่อผู้ใช้เดียวกัน
  • ตรวจสอบด้วย SELECT User, Host FROM mysql.user;

9.3 ใส่ใจปลั๊กอินการตรวจสอบสิทธิ์ใน 8.0

  • ค่าเริ่มต้นของ 8.0: caching_sha2_password
  • ความเข้ากันได้แบบเก่า: mysql_native_password
  • หากไม่สามารถเชื่อมต่อได้, ตรวจสอบคอลัมน์ plugin
    SELECT plugin FROM mysql.user WHERE User='username';
    

9.4 ระมัดระวังเมื่อกู้คืนรหัสผ่าน root

  • --skip-grant-tables เป็นมาตรการชั่วคราวเท่านั้น
  • ควรกลับสู่โหมดปกติเสมอหลังจากเสร็จสิ้น
  • ทำในช่วงเวลาบำรุงรักษาในระบบผลิต

9.5 ส่วนใหญ่ของข้อผิดพลาดมีสาเหตุที่ชัดเจน

  • ERROR 1819 → การละเมิดนโยบายรหัสผ่าน
  • ERROR 1227 → สิทธิ์ไม่เพียงพอ
  • ไม่สามารถเข้าสู่ระบบ → ความไม่ตรงกันของโฮสต์หรือปลั๊กอินการตรวจสอบสิทธิ์

9.6 ในการปฏิบัติ, สิทธิ์น้อยที่สุดและการออกแบบการดำเนินงานเป็นสิ่งสำคัญที่สุด

  • ห้ามใช้ root ในแอปพลิเคชัน
  • สร้างผู้ใช้เฉพาะ
  • บังคับใช้นโยบายรหัสผ่านที่แข็งแรง
  • ทดสอบการเชื่อมต่อเสมอหลังการเปลี่ยนแปลง

การจัดการรหัสผ่าน MySQL ไม่ได้เป็นเพียงการเปลี่ยนค่า—มันเป็น พื้นฐานของการดำเนินงานฐานข้อมูลที่ปลอดภัย.
เลือกวิธีที่เหมาะสมกับสภาพแวดล้อมของคุณและดำเนินการอย่างระมัดระวัง.