mysqld.sock ควรประกอบด้วยอะไรทำไมฉันไม่มีมัน


22

ไม่มีใครรู้ว่าทำไม/var/run/mysqld/mysqld.sockไฟล์ซ็อกเก็ตของฉันจะไม่อยู่ในคอมพิวเตอร์ของฉันเมื่อฉันติดตั้ง (หรือติดตั้งใหม่) MySQL 5.1?

ตอนนี้เมื่อฉันพยายามเริ่มต้นเซิร์ฟเวอร์ด้วย mysqld ฉันได้รับข้อผิดพลาดเช่นCan't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) when trying to connectแต่การสร้างไฟล์ว่างเปล่าด้วยชื่อนั้น (ตามที่แนะนำบนฟอรัม Ubuntu) ไม่สำเร็จ

ฉันมีทั้ง mysql และ postgres ที่ให้บริการได้ดีจนกระทั่งฉันอัพเกรดเป็น natty เมื่อไม่นานมานี้; ฉันใช้เวลาหลายชั่วโมงในการเดินผ่านฐานข้อมูลทั้งสองพยายามหาว่าเกิดอะไรขึ้น ฉันสามารถละทิ้ง postgres ได้ แต่ฉันไม่สามารถทำงานได้หากไม่มีสำเนา mysql ที่ใช้งานได้

ส่วนที่แปลกที่สุด: ฉันใช้ Kubuntu และความเข้าใจของฉันคือ KDE ใช้ mysql เพื่อจัดเก็บสิทธิ์ผู้ใช้ ฯลฯ ฉันไม่พบปัญหาการอนุญาตแปลก ๆ ฉันใช้สิ่งนี้เพื่อหมายความว่า (อย่างใด?) MySQL ใช้งานได้จริงหรือ

บางทีไฟล์ซ็อกเก็ตเหล่านี้อาศัยอยู่ในสถานที่ที่แตกต่างกันใน natty? การติดตั้งระบบปฏิบัติการใหม่จะง่ายขึ้นไหม ณ จุดนี้ฉันเปิดให้คำแนะนำใด ๆ ที่จะหยุดเสียเวลาของฉัน


คุณต้องเริ่มต้นเซิร์ฟเวอร์ mysql ก่อนจากนั้นไฟล์/var/run/mysqld/mysqld.sockนั้นจะถูกสร้างขึ้น ตามที่ @Paul พูดคุณต้องลบไฟล์ใด ๆ ที่คุณใส่ไว้ในตำแหน่งนั้น
Evan Hu

คำตอบ:


18

ไฟล์ซ็อกเก็ตไม่มีข้อมูล แต่ส่งผ่านไปมา .. มันเป็นไฟล์ชนิดพิเศษที่ผิดปกติซึ่งสร้างขึ้นด้วยการเรียก / คำสั่งพิเศษของระบบ มันไม่ใช่ไฟล์ธรรมดา

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

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

คำแนะนำของฉันคือการลบไฟล์ใด ๆ ที่คุณใส่ไว้ในสถานที่ เซิร์ฟเวอร์ซ็อกเก็ตไฟล์พิเศษถูกสร้างขึ้น


1
ขอบคุณสำหรับคำอธิบายของไฟล์ซ็อกเก็ตและขออภัยในคำถามที่มีคำพูดไม่ดี: ปัญหาเดิมของฉันคือไฟล์ซ็อกเก็ตหายไป - ข้อผิดพลาดที่ mysql ยังคงขว้างอยู่Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) when trying to connect
egbutter

แต่มันสร้างขึ้นมาได้อย่างไร? เพราะฉันยังไม่มี ... : - ความคิดใด ๆ
jpganz18

คุณอาจมีไคลเอนต์ mysql ที่คาดว่าซ็อกเก็ตจะอยู่ในตำแหน่งนั้น แต่เซิร์ฟเวอร์ไม่ได้สร้างขึ้นที่นั่น (หรือเซิร์ฟเวอร์ไม่ทำงาน) หากเซิร์ฟเวอร์ทำงานอยู่ให้ดู / tmp หรือใช้ค้นหาหรือค้นหา ค้นหาไฟล์ซ็อกเก็ตจากนั้นเริ่มไคลเอนต์ mysql ด้วย -S <path to socket file>
sed_and_done

20

เมื่อคุณระบุhost=localhostไคลเอนต์ mysql จะพยายามเข้าสู่เซิร์ฟเวอร์ mysql โดยใช้ unix ชื่อไพพ์ซึ่งต้องใช้.sockไฟล์

สามารถข้ามได้โดยระบุ host = 127.0.0.1 สิ่งนี้จะทำให้ไคลเอนต์ mysql ใช้ TCP เพื่อเชื่อมต่อกับเซิร์ฟเวอร์

นำมาจากเอกสารของ MySQL :

mysql --host=127.0.0.1 --port=3306 --user=your_uname --password=your_pass

นี่เป็นคำตอบที่ยอดเยี่ยม (และจำเป็นมาก) เพราะในอดีตที่ผ่านมาฉันได้เห็นการmysql.sockหายตัวไปโดยไม่มีเหตุผลที่ดีใน MySQL ทุกรุ่นที่ฉันทำงานด้วย (กลับไปที่ 4.0) เมื่อเกิดเหตุการณ์นี้ผมเข้าสู่ระบบเพียงเช่นนี้ แต่ฉันจะใช้แทน--protocol=tcp --portเมื่อคุณปิด mysql บริการจะค้นหาไฟล์ซ็อกเก็ต ดังนั้นการทำงานservice mysql stopจะล้มเหลว mysqladmin -h127.0.0.1 --protocol=tcp -uroot -p shutdownที่จะได้รับรอบหายปวดหัวไฟล์ซ็อกเก็ตผมทำงาน โอ้ BTW +1 !!!
RolandoMySQLDBA

ขอขอบคุณ. นี่เป็นคำตอบแรกของฉันทุกที่ออนไลน์ :) และใช่ วิธีทางเลือกในการใช้ TCP คือการระบุ --protocol = tcp
sccott

14

ซ็อกเก็ตเป็นไฟล์หลอกพิเศษที่ใช้สำหรับการส่งข้อมูลโดยการอ่านและการเขียนไม่ใช่ที่จัดเก็บข้อมูล

ไฟล์ซ็อกเก็ตถูกสร้างขึ้นเมื่อบริการเริ่มต้นและลบออกเมื่อบริการถูกยกเลิก ตำแหน่งของไฟล์ถูกกำหนดไว้/etc/my.cnfดังนี้:

[mysqld]
socket=/var/run/mysql/mysql.sock

8

ในกรณีของฉันทำงานmysqld_safeสร้างmysqld.sockไฟล์ใหม่

$ cd /etc/init.d/
$ mysqld_safe

คุณอาจจะไม่ได้รับการตอบกลับ แต่ถ้าคุณรีสตาร์ทเซสชันไฟล์ mysqld.sock จะอยู่ที่ใดที่หนึ่ง ค้นหาด้วย

$ sudo find / -type s | grep mysqld.sock

2

ฉันมีปัญหาเดียวกันกับ mysqld.sock ที่หายไป ฉันไปที่ไดเรกทอรีที่มี mysql คือ/usr/binในกรณีของฉัน จากนั้นฉันก็ออกคำสั่ง

mysql mysql --host=localhost --password=whatever --port=3306

double mysql ไม่ใช่ typo แต่ mysql เป็นฐานข้อมูลที่จะมีในการติดตั้ง MySQL ใหม่เสมอ ผมไม่ทราบว่าถ้า--host, --passwordหรือ--portมีความจำเป็น แต่เนื่องจากมันทำงานให้ฉันใช้พารามิเตอร์เหล่านี้ฉันกำลังรวมถึงพวกเขา เมื่อ MySQL ขึ้นมาฉันเข้าไปในตารางผู้ใช้เพื่อตั้งรหัสผ่านสำหรับรูท เมื่อ MySQL สร้างไฟล์ซ็อกเก็ตที่หายไปขึ้นมา ฉันหวังว่านี่จะช่วยให้ใครบางคนตั้งแต่ฉันต่อสู้มาหลายวัน


1

หากคุณกำลังใช้ nginx php-fastcgi และคุณมีข้อผิดพลาด502 Bad Gatewayมากกว่าที่คุณต้องดูการกำหนดค่าโฮสต์เสมือนของคุณในไฟล์กำหนดค่า nginx คุณต้องตั้งค่าหรือแก้ไขfastcgi_passพารามิเตอร์ซึ่งfastcgi_passเป็นตัวแปรในการตั้งค่าการเชื่อมต่อซ็อกเก็ตระหว่าง nginx และ php CGI

อีกประเด็นหนึ่งคือสคริปต์เริ่มต้นไบนารีอาจพลาดรายการต่อไปนี้ (สำคัญ) ที่เปิดด้วย: nano /usr/bin/php-fastcgi

SOCKET=/var/run/php-fastcgi/php-fastcgi.socket
PIDFILE=/var/run/php-fastcgi/php-fastcgi.pid

เนื้อหาที่สมบูรณ์ของสคริปต์เริ่มต้น / usr / bin / php-fastcgi ของฉัน:

#!/bin/bash

FASTCGI_USER=www-data
FASTCGI_GROUP=www-data
SOCKET=/var/run/php-fastcgi/php-fastcgi.socket
PIDFILE=/var/run/php-fastcgi/php-fastcgi.pid
CHILDREN=6
PHP5=/usr/bin/php5-cgi

/usr/bin/spawn-fcgi -s $SOCKET -P $PIDFILE -C $CHILDREN -u $FASTCGI_USER -g $FASTCGI_GROUP -f $PHP5
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.