วิธีการบังคับให้ MySQL เชื่อมต่อโดย TCP แทน Unix socket?


46

ฉันต้องการวิเคราะห์mysqlปริมาณการใช้งาน ตอนนี้คำขอ mysql ทั้งหมดจะถูกส่งไปยังซ็อกเก็ต MySQL unix:

unix  2      [ ACC ]     STREAM     LISTENING     3734388  15304/mysqld        /var/run/mysqld/mysqld.sock

ฉันกำลังพยายามปิดใช้งานซ็อกเก็ตนั้นเพื่อบังคับให้ MySQL ใช้ซ็อกเก็ตเครือข่ายแทนบนลูปแบ็ค ฉันพยายามแสดงความคิดเห็นsocketคำสั่งทั้งหมดในmy.cnfและdebian.cnfไฟล์และเริ่ม MySQL ใหม่ แต่ก็ไม่ได้ทำให้แตกต่าง

ฉันจะปิดการใช้งานซ็อกเก็ต MySQL ยูนิกซ์เพื่อบังคับให้ MySQL ผ่านเครือข่ายได้อย่างไร

ข้อมูลเพิ่มเติม: ผมทำงานเกี่ยวกับMySQL 5.1ubuntu 10.04

ความแม่นยำของคำถาม
เนื่องจากมีผู้คนจำนวนมากแนะนำให้เปิดใช้งานซ็อกเก็ตเครือข่ายฉันต้องการชี้แจงคำถามของฉันโดยชี้ให้เห็นว่าที่อยู่ผูกถูกเปิดใช้งานแล้วbind-address = 127.0.0.1และมีการเชื่อมต่อการฟังที่มีอยู่:

tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      15601/mysqld 

ถึงกระนั้นฉันก็ยังไม่เห็นการเชื่อมต่อพยายามที่จะ127.0.0.1:3306มาจาก webapp ของฉัน (เว็บไซต์ Drupal)

อัปเดตพร้อมคำตอบ

ดูเหมือนว่าปัญหานั้นมาจากmysqliตัวเชื่อมต่อที่ Drupal ใช้ ( .ht_config.phpสำหรับผู้ที่สนใจ) มันได้รับการตั้งค่า: mysqli://drupal:***@localhost/drupalการเปลี่ยนlocalhostเป็นการ127.0.0.1แก้ไขปัญหา (เช่น Drupal กำลังทำการเชื่อมต่อกับซ็อกเก็ตเครือข่าย)

คำตอบ:


52

ใช้ 127.0.0.1IP-ผูกพันกับ localhostที่ควรเปิดใช้งานพอร์ตฟังบน ในฝั่งไคลเอ็นต์ห้ามใช้localhost- ใช้127.0.0.1แทน ไคลเอนต์จำนวนมากมีนามแฝงภายในที่ทำให้พวกเขาเชื่อมต่อกับซ็อกเก็ตถ้าคุณระบุlocalhostเป็นเป้าหมาย

MySQL นั้นแปลก


6
แค่ใช้--protocol.. ดูคำตอบของโจนาธาน
Pacerier

75

ใน Linux และ * อื่น ๆ MySQL จะถือว่าคุณต้องการใช้ซ็อกเก็ตหากคุณเชื่อมต่อกับโฮสต์ "localhost" (ซึ่งจะเป็นชื่อโฮสต์เริ่มต้น)

คุณสามารถลบล้างสิ่งนี้ได้ 3 วิธี: 1) ระบุชื่อโฮสต์อื่นเช่น 127.0.0.1 ( mysql -h 127.0.0.1) หรือชื่อโฮสต์จริงของเซิร์ฟเวอร์ 2) ระบุว่าคุณต้องการใช้ TCP และไม่ใช่ซ็อกเก็ต ( mysql --protocol tcp)

คุณยังสามารถทำให้การแก้ไข my.cnf เริ่มต้นของคุณเป็นแบบนี้ได้อย่างง่ายดาย ([ลูกค้า] หมายถึงลูกค้าใด ๆ :

[client]
protocol=tcp

คุณสามารถดูคำอธิบายทั้งหมดเกี่ยวกับวิธีที่ MySQL ตัดสินใจว่าจะเชื่อมต่อที่นี่:

http://dev.mysql.com/doc/refman/5.5/en/connecting.html


6
นี่ควรเป็นคำตอบที่ยอมรับได้
Pacerier

การเรียกใช้เซิร์ฟเวอร์ MySQL ภายในคอนเทนเนอร์ Docker ที่มี docker-compose โดยใช้ชื่อคอนเทนเนอร์เนื่องจากชื่อโฮสต์บังคับให้ใช้เครือข่าย protocl ผ่านโปรโตคอลซ็อกเก็ตหรือไม่
Stephane

defintiely ควรเป็นคำตอบที่ยอมรับได้ วิธีที่ 3 (โปรโตคอล = tcp ใน my.cnf) เป็นวิธีเดียวที่ทำงานโดยไม่มีพารามิเตอร์บรรทัดคำสั่งเพิ่มเติมดังนั้นจึงทำงานได้โดยไม่มีการเปลี่ยนแปลงในสคริปต์ใด ๆ
Tuncay Göncüoğlu

16

นี่ไม่ใช่ปัญหาของลูกค้าหรือ หากใช้โปรแกรม mysql คุณสามารถใช้--protocolสวิตช์ได้ จากหน้าคน

 --protocol={TCP|SOCKET|PIPE|MEMORY}

       The connection protocol to use for connecting to the server. It is
       useful when the other connection parameters normally would cause a
       protocol to be used other than the one you want. For details on the
       allowable values, see Section 4.2.2, “Connecting to the MySQL
       Server”.

ฉันแค่พยายาม

mysql --protocol=TCP -u root -p

ในขณะที่ตรวจสอบพอร์ต 3306 ด้วยtcpdump -i lo tcp port 3306และฉันสามารถเห็นการจราจรในขณะที่ถ้าฉันเพิ่งทำงาน

mysql  -u root -p

ฉัน (ไม่ถูกต้อง) ไม่เห็นทราฟฟิกที่พอร์ต 3306

แก้ไข:

ตอนนี้คุณบอกเราว่าคุณกำลังใช้ DRUPAL การแก้ปัญหาค่อนข้างง่าย

ไปที่sites/<sitename>หรือsites/defaultและแก้ไขsettings.phpไฟล์

คุณจะพบโครงสร้างเช่นนี้

$databases = array (
  'default' =>
  array (
    'default' =>
    array (
      'database' => 'databasename',
      'username' => 'databaseuser',
      'password' => 'databasepassword',
      'host' => 'localhost',
      'port' => '',
      'driver' => 'mysql',
      'prefix' => '',
    ),
  ),
);

เปลี่ยน'localhost'ไป'127.0.0.1'และบันทึกไฟล์


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

1
ดีโดยบอกว่าno controlฉันเป็นละคร ฉันสามารถแก้ไข.ht_config.phpไฟล์และแก้ไขปัญหาได้
สูงสุด

ตาดอย่างมากบางที แต่มันเป็นปัญหาของลูกค้าและจะแก้ไขได้อย่างง่ายดาย ดูการแก้ไขของฉัน
user9517 รองรับ GoFundMonica

ขออภัยฉันอัปเดตคำถามพร้อมคำตอบหลังจากที่เพิ่มความคิดเห็น ด้วยเหตุผลบางอย่างเราจะใช้แทน.ht_config.php settings.phpฉันไม่รู้ว่าทำไม (ทีม dev ขอมันควรเป็นอย่างนั้น) ตอนนี้ปัญหาคือ Drupal ดูเหมือนว่าจะอ่าน.ht_config.phpไฟล์ในทุกคำขอ (เพราะถ้าฉันเปลี่ยนการเปลี่ยนแปลงจะถูกนำมาพิจารณาทันที) ซึ่งไม่สามารถช่วยในการแสดงได้ เราจะมองหาวิธีในการแคชการตั้งค่าเหล่านั้นที่ชั้นแอปพลิเคชัน แต่นั่นเป็นปัญหาที่แตกต่างกัน
สูงสุด

หมายเหตุ: คุณไม่สามารถทำได้--protocol=socketถ้าคุณมีhostรายการใน[client]ส่วนของ.my.cnfมันทำให้เกิดwrong or unknown protocolข้อผิดพลาด (mysql 5.7.13)
กริช

1

นี่อาจฟังดูบ้าไปหน่อย

ลองตั้งค่าไฟล์ซ็อกเก็ตเป็นพา ธ สัมบูรณ์ที่มีพา ธ อยู่บนเครื่องอื่น

http://dev.mysql.com/doc/refman/5.0/en/server-options.html#option_mysqld_socket

มิฉะนั้นคุณจะไม่สามารถหลีกเลี่ยงพฤติกรรมเริ่มต้นนี้ได้เพราะไฟล์ซ็อกเก็ตจะต้องมีอยู่เพื่อให้ mysqld สื่อสาร


1

แก้ไข my.cnf และเพิ่มคำสั่ง

bind-address = 127.0.0.1

หรือ IP ที่คุณต้องการเพื่อให้สามารถเข้าถึงผ่านเครือข่าย เริ่ม mysql อีกครั้งเพื่อให้ทำงานได้


1

php mysqli client จะใช้ไฟล์ซ็อกเก็ต unix แทนเครือข่าย tcp เมื่อคุณผ่านค่า NULL หรือสตริง "localhost" ( http://www.php.net/manual/en/mysqli.construct.php )

ดูเหมือนว่าไคลเอนต์ sqlyog มักจะใช้เครือข่าย tcp แม้ว่าคุณจะกรอก "localhost" ในนั้น


0

ฉันต้องลบ /etc/my.cnf (หลังจากสำรองข้อมูล) จากนั้นรีสตาร์ทเซิร์ฟเวอร์ จากนั้นฉันก็สามารถเชื่อมต่อกับซ็อกเก็ตและข้อผิดพลาดหายไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.