วิธีที่เร็วที่สุดในการแยกแยะข้อผิดพลาด “Failed to connect to database” ใน ownCloud 10 คือการทดสอบด้วยบัญชี MySQL ชื่อฐานข้อมูล และโฮสต์เดียวกันจากเซิร์ฟเวอร์ ownCloud เอง หากการเข้าสู่ระบบล้มเหลว ให้แก้ไขปัญหาความพร้อมใช้งานของ MySQL การเข้าถึงเครือข่าย ข้อมูลประจำตัว หรือสิทธิ์การเข้าถึงก่อน หากสำเร็จ ให้ตรวจสอบ ownCloud ส่วนขยาย config/config.phpPHP pdo_mysqlและตรวจสอบว่า PHP ใช้การเชื่อมต่อแบบ socket หรือ TCP ที่ถูกต้องหรือไม่
คู่มือนี้ครอบคลุมการติดตั้ง ownCloud Server 10 ที่มีอยู่แล้วโดยใช้ MySQL หรือ MariaDB บน Linux ชื่อบริการและคำสั่งแพ็กเกจจะแตกต่างกันไปตามระบบปฏิบัติการและประเภทการติดตั้ง สำรองข้อมูลการกำหนดค่าและฐานข้อมูลก่อนแก้ไขการตั้งค่าสำหรับการใช้งานจริง ห้ามแชร์รหัสผ่านฐานข้อมูลในประเด็นปัญหาหรือคัดลอกไปวางในบันทึกคำสั่งสาธารณะเด็ดขาด
ข้อผิดพลาดนี้บอกอะไรคุณบ้าง?
ข้อความดังกล่าวเป็นเพียงอาการ ไม่ใช่การวินิจฉัยโรค โปรดอ่านบันทึกของ ownCloud และบันทึกของเว็บเซิร์ฟเวอร์หรือ PHP ในขณะที่เกิดความล้มเหลว ข้อผิดพลาดที่เกิดขึ้นอาจระบุถึงไดรเวอร์ที่หายไป การเชื่อมต่อที่ถูกปฏิเสธ การเข้าสู่ระบบที่ถูกปฏิเสธ หรือฐานข้อมูลที่ไม่รู้จัก คู่มือฐานข้อมูล Linux ของ ownCloud กำหนดให้ใช้pdo_mysqlส่วนขยายของ PHP และระบุว่าการตั้งค่าซ็อกเก็ตมีความสำคัญเมื่อ MySQL อยู่ในเครื่องเดียวกัน ขอแนะนำให้ทดสอบการเข้าถึงด้วยไคลเอ็นต์บรรทัดคำสั่งของ MySQL
| ข้อความหรือเบาะแส | พื้นที่น่าตรวจสอบ |
could not find driverหรือข้อผิดพลาดของไดรเวอร์ PDO | รันไทม์ PHP บนเว็บไม่ได้pdo_mysqlเปิดใช้งาน |
SQLSTATE[HY000] [2002]หรือ “ไม่สามารถเชื่อมต่อได้” | MySQL หยุดทำงาน โฮสต์หรือพอร์ตไม่ถูกต้อง ไฟร์วอลล์ปิดกั้น TCP หรือเส้นทางซ็อกเก็ตไม่ถูกต้อง |
Access denied for user | รหัสผ่าน โฮสต์บัญชี หรือการตั้งค่าการตรวจสอบสิทธิ์ MySQL ไม่ตรงกัน |
Unknown database | ชื่อฐานข้อมูลที่กำหนดค่าไว้สะกดผิด ขาดหาย หรือไม่ปรากฏให้บัญชีผู้ใช้เห็น |
รหัสข้อผิดพลาดที่แน่นอนอาจแตกต่างกันไปตามเวอร์ชันของ PHP, MySQL, MariaDB และระบบปฏิบัติการ ให้ถือว่ารหัสเหล่านี้เป็นเพียงเบาะแส และยืนยันสาเหตุด้วยการตรวจสอบด้านล่าง เอกสารเกี่ยวกับข้อผิดพลาด "การเข้าถึงถูกปฏิเสธ" ของ MySQL ระบุว่า การจับคู่บัญชีและโฮสต์เป็นสาเหตุที่พบบ่อย
โฮสต์ ownCloud สามารถเชื่อมต่อกับ MySQL ได้หรือไม่?
ตรวจสอบว่า MySQL ทำงานอยู่บนเซิร์ฟเวอร์ ownCloud เครื่องอื่น หรือคอนเทนเนอร์ บน Linux ให้ตรวจสอบบริการ ชื่อหน่วยที่ใช้กันทั่วไปคือmysqlและmariadb; ให้ใช้ตัวที่ติดตั้งอยู่บนเซิร์ฟเวอร์ของคุณ:
sudo systemctl status mysql
sudo systemctl status mariadb
หากโปรแกรมไม่ทำงาน ให้ตรวจสอบบันทึกเหตุการณ์หรือบันทึกข้อผิดพลาดของฐานข้อมูลก่อนที่จะเริ่มต้นใหม่ ข้อผิดพลาดในการกำหนดค่า ดิสก์เต็ม การกู้คืนฐานข้อมูลล้มเหลว หรือความขัดแย้งของพอร์ต อาจทำให้โปรแกรมไม่สามารถเริ่มต้นได้:
sudo journalctl -u mariadb --since "30 minutes ago"
sudo systemctl start mariadb
เปลี่ยนชื่อบริการให้เหมาะสม การที่บริการทำงานอยู่ไม่ได้หมายความว่า ownCloud สามารถตรวจสอบสิทธิ์ได้ โปรดดำเนินการทดสอบบัญชีต่อไป
สำหรับฐานข้อมูลระยะไกล ให้ทดสอบ DNS และพอร์ต TCP ที่กำหนดค่าไว้จากโฮสต์ ownCloud โดยทั่วไป MySQL จะรับฟังการเชื่อมต่อที่พอร์ต 3306 แม้ว่าการใช้งานจริงอาจใช้พอร์ตอื่นก็ได้:
getent hosts db.example.net
nc -vz db.example.net 3306
การตรวจสอบที่ล้มเหลวอาจชี้ไปที่ DNS, การกำหนดเส้นทาง, ไฟร์วอลล์ หรือการกำหนดค่าตัวรับฟังฐานข้อมูล อนุญาตการเชื่อมต่อจากเซิร์ฟเวอร์ ownCloud ผ่านเครือข่ายส่วนตัวเท่านั้นหากเป็นไปได้ อย่าเปิดเผย MySQL สู่สาธารณะทางอินเทอร์เน็ตเพื่อเป็นทางลัด
บัญชีฐานข้อมูลใช้งานได้จากโฮสต์ ownCloud หรือไม่?
เรียกใช้ไคลเอ็นต์ MySQL บนเซิร์ฟเวอร์แอปพลิเคชันโดยใช้ชื่อฐานข้อมูล ผู้ใช้ และโฮสต์ปลายทางเดียวกันกับที่ ownCloud ควรใช้-pตัวเลือกนี้จะถามรหัสผ่านแบบส่วนตัว ซึ่งจะช่วยหลีกเลี่ยงการใส่รหัสผ่านในคำสั่งโดยตรง:
mysql -u oc_app -p -h localhost owncloud
สำหรับฐานข้อมูลระยะไกล ให้แทนที่localhostด้วยชื่อโฮสต์ของฐานข้อมูลนั้น หากการเข้าสู่ระบบสำเร็จ ให้ทำการตรวจสอบยืนยันที่ไม่เป็นอันตราย:
SELECT DATABASE(), CURRENT_USER();
SHOW TABLES;
EXIT;
ขั้นตอน นี้เป็นการยืนยันการตรวจสอบสิทธิ์ขั้นพื้นฐานและการเข้าถึงฐานข้อมูลที่เลือก หากล้มเหลว โปรดอ่านข้อผิดพลาดที่เกิดขึ้นอย่างละเอียดและชื่อผู้ใช้/โฮสต์ที่ MySQL รายงาน MySQL จะพิจารณาชื่อผู้ใช้และโฮสต์ร่วมกันเมื่อทำการจับคู่บัญชี โปรดทราบด้วยว่าlocalhostบน Linux โดยทั่วไปจะใช้ซ็อกเก็ต Unix ในขณะที่127.0.0.1บังคับใช้ TCP ทดสอบวิธีการเชื่อมต่อแบบเดียวกับที่การกำหนดค่า ownCloud ของคุณใช้:
mysql -u oc_app -p -h 127.0.0.1 owncloud
การตั้งค่าฐานข้อมูล ownCloud ถูกต้องหรือไม่
ตรวจสอบไฟล์ที่ใช้งานconfig/config.phpอยู่ในไดเร็กทอรีการติดตั้ง ownCloud เอกสารอ้างอิงการกำหนดค่า ownCloud แสดงรายการประเภทฐานข้อมูล ชื่อ ผู้ใช้ และรหัสผ่าน นอกจากนี้ คู่มือฐานข้อมูลยังแสดงโฮสต์และคำนำหน้าตารางด้วย การกำหนดค่า MySQL ทั่วไปจะมีลักษณะดังนี้:
'dbtype' => 'mysql',
'dbname' => 'owncloud',
'dbuser' => 'oc_app',
'dbpassword' => 'REDACTED',
'dbhost' => 'localhost',
'dbtableprefix' => 'oc_',
ตรวจสอบการสะกดคำผิด ช่องว่างที่ไม่จำเป็น รหัสผ่านที่ล้าสมัย ชื่อฐานข้อมูลที่มีตัวพิมพ์ใหญ่และตัวพิมพ์เล็กแตกต่างกัน หรือโฮสต์ที่ชี้ไปยังเซิร์ฟเวอร์ที่ไม่ถูกต้อง เก็บส่วนที่เหลือของไฟล์ไว้ รวมถึงรหัสลับของอินสแตนซ์และไดเร็กทอรีข้อมูล อย่าแทนที่การกำหนดค่าทั้งหมดด้วยตัวอย่างนี้
หลังจากแก้ไขเสร็จแล้ว ให้ตรวจสอบว่าไฟล์นั้นเป็นไฟล์ PHP ที่ถูกต้อง โดยใช้ไบนารี PHP สำหรับการติดตั้งของคุณ:
php -l /var/www/owncloud/config/config.php
เส้นทางการติดตั้งของคุณอาจแตกต่างออกไป โปรดจำกัดการเข้าถึงconfig.phpเนื่องจากมีข้อมูลประจำตัวฐานข้อมูลและค่าสำคัญอื่นๆ
เว็บแอปพลิเคชันได้เปิดใช้งานไดรเวอร์ MySQL ของ PHP แล้วหรือไม่?
คู่มือฐานข้อมูลของ ownCloud 10 ต้องการpdo_mysql. ตรวจสอบเวอร์ชัน PHP และโมดูลที่โหลดแล้ว:
php -v
php -m | grep -i pdo_mysql
หากโมดูลหายไป ให้ติดตั้งแพ็กเกจ MySQL PDO ที่เหมาะสมกับเวอร์ชัน PHP ของคุณ จากนั้นรีสตาร์ทหรือรีโหลดเว็บเซิร์ฟเวอร์หรือพูล PHP-FPM ที่เกี่ยวข้อง ชื่อแพ็กเกจจะแตกต่างกันไปใน Ubuntu, Debian, SUSE, Red Hat และอิมเมจคอนเทนเนอร์ โมดูลที่เปิดใช้งานสำหรับ PHP แบบบรรทัดคำสั่งอาจไม่ได้เปิดใช้งานสำหรับ Apache หรือ PHP-FPM ดังนั้นตรวจสอบการกำหนดค่า PHP ของรันไทม์เว็บด้วย หลีกเลี่ยงการออกจากหน้าวินิจฉัยสาธารณะที่เปิดเผยข้อมูลการกำหนดค่า PHP
เป็นไปได้ไหมที่การตั้งค่าซ็อกเก็ตหรือโฮสต์จะผิดพลาด?
บนระบบ Linux ไคลเอนต์ MySQL อาจใช้ซ็อกเก็ต Unix สำหรับการเชื่อมต่อlocalhostในขณะที่127.0.0.1ใช้ TCP หาก MySQL อยู่บนเครื่องเดียวกัน ให้ตรวจสอบว่า PHP mysql.default_socketชี้ไปยังไฟล์ซ็อกเก็ตที่เซิร์ฟเวอร์ฐานข้อมูลสร้างขึ้นจริงหรือไม่ เปรียบเทียบการตั้งค่าซ็อกเก็ตและพอร์ตของเซิร์ฟเวอร์ฐานข้อมูลกับการตั้งค่าของ PHP และค่าโฮสต์ของ ownCloud
หาก MySQL อยู่บนเครื่องระยะไกล ให้localhostเป็นเครื่อง ownCloud ไม่ใช่เซิร์ฟเวอร์ฐานข้อมูล ให้ตั้งค่าชื่อโฮสต์ของฐานข้อมูลที่สามารถเข้าถึงได้แทน และตรวจสอบให้แน่ใจว่า MySQL รับฟังการเชื่อมต่อบนอินเทอร์เฟซที่ต้องการ ไฟร์วอลล์หรือการอนุญาตเฉพาะภายในเครื่องbind-addressอาจป้องกันการเข้าถึงระยะไกลได้ แม้ว่าคำสั่งฐานข้อมูลภายในเครื่องจะทำงานได้ก็ตาม จำกัดการเข้าถึงเฉพาะที่อยู่ส่วนตัวของเซิร์ฟเวอร์แอปพลิเคชัน
บัญชีผู้ใช้ MySQL และสิทธิ์การเข้าถึงตรงกับเครื่องไคลเอ็นต์หรือไม่
บัญชี MySQL ประกอบด้วยชื่อผู้ใช้และส่วนประกอบโฮสต์ ดังนั้น'oc_app'@'localhost'และ'oc_app'@'10.0.0.25'จึงเป็นรายการบัญชีที่แตกต่างกัน ใช้การเชื่อมต่อแบบผู้ดูแลระบบเพื่อตรวจสอบบัญชีที่มีอยู่และสิทธิ์การเข้าถึงสำหรับบัญชีที่ควรตรงกัน:
SELECT User, Host FROM mysql.user;
SHOW GRANTS FOR 'oc_app'@'localhost';
หากไม่มีบัญชีผู้ใช้และฐานข้อมูลมีอยู่แล้ว ให้สร้างบัญชีผู้ใช้เฉพาะและให้สิทธิ์เฉพาะในการเข้าถึงฐานข้อมูล ownCloud เท่านั้น แทนที่ฐานข้อมูล โฮสต์ และรหัสผ่านในตัวอย่างด้วยค่าจริงของคุณ:
CREATE USER 'oc_app'@'localhost' IDENTIFIED BY 'replace-with-a-strong-password';
GRANT ALL PRIVILEGES ON owncloud.* TO 'oc_app'@'localhost';
สำหรับฐานข้อมูลระยะไกล ให้ใช้โฮสต์จริงของเซิร์ฟเวอร์แอปพลิเคชันในการกำหนดบัญชี หลีกเลี่ยงการใช้โฮสต์แบบไวด์การ์ดหรือสิทธิ์ส่วนกลางเป็นวิธีแก้ปัญหาชั่วคราว และอย่าเรียกใช้ ownCloud ในฐานะ root ของ MySQL หากบัญชีมีอยู่แล้ว ให้ตรวจสอบสิทธิ์และรีเซ็ตรหัสผ่านอย่างรอบคอบแทนที่จะสร้างบัญชีซ้ำซ้อน ทดสอบการเข้าสู่ระบบอีกครั้งจากเซิร์ฟเวอร์ ownCloud
คุณจะยืนยันการซ่อมแซมได้อย่างไร?
หลังจากเปลี่ยนทีละรายการแล้ว ให้ตรวจสอบว่าการเข้าสู่ระบบ MySQL ผ่านบรรทัดคำสั่งนั้นใช้งานได้จากโฮสต์ ownCloud รันไทม์ PHP บนเว็บทำงานได้pdo_mysqlและบันทึกของ ownCloud ไม่บันทึกข้อผิดพลาดในการเชื่อมต่ออีกต่อไป โหลดเว็บไซต์ใหม่และดำเนินการอ่านและเขียนข้อมูลพื้นฐานเฉพาะเมื่ออินสแตนซ์พร้อมใช้งานอีกครั้งเท่านั้น
หากการล็อกอินผ่านบรรทัดคำสั่งสำเร็จ แต่ ownCloud ยังคงใช้งานไม่ได้ ให้เปรียบเทียบรูปแบบโฮสต์ บัญชี ชื่อฐานข้อมูล และรันไทม์ PHP ที่ใช้โดยกระบวนการเว็บกับตัวอย่างที่ใช้งานได้ ตรวจสอบบันทึกของเว็บเซิร์ฟเวอร์หรือ PHP-FPM ในขณะที่มีการร้องขอ สำหรับเซิร์ฟเวอร์ที่ติดตั้งไว้แล้ว ให้ซ่อมแซมการกำหนดค่าที่มีอยู่ด้วยความระมัดระวัง อย่าลบฐานข้อมูลหรือเรียกใช้การติดตั้งใหม่เพื่อเป็นทางลัดในการแก้ไขปัญหา
สำหรับข้อมูลเพิ่มเติม โปรดอ่านคู่มือการกำหนดค่าและการแก้ไขปัญหาฐานข้อมูล ownCloud Server 10.16 , คู่มืออ้างอิงการกำหนดค่า ownCloud 10.15และคู่มืออย่างเป็นทางการของ MySQL เกี่ยวกับการแก้ไขปัญหาการเชื่อมต่อและข้อผิดพลาดการเข้าถึงถูกปฏิเสธชื่อบริการ คำสั่งแพ็กเกจ และการตั้งค่าที่แน่นอนจะขึ้นอยู่กับระบบปฏิบัติการและการติดตั้งใช้งานของคุณ