ภาษาอังกฤษอาหารฝรั่งเศสสเปน

ไอคอน Fav ของ OnWorks

pt-table-usagep - ออนไลน์ใน Cloud

เรียกใช้ pt-table-usagep ในผู้ให้บริการโฮสต์ฟรีของ OnWorks ผ่าน Ubuntu Online, Fedora Online, โปรแกรมจำลองออนไลน์ของ Windows หรือโปรแกรมจำลองออนไลน์ของ MAC OS

นี่คือคำสั่ง pt-table-usagep ที่สามารถเรียกใช้ในผู้ให้บริการโฮสต์ฟรีของ OnWorks โดยใช้หนึ่งในเวิร์กสเตชันออนไลน์ฟรีของเรา เช่น Ubuntu Online, Fedora Online, โปรแกรมจำลองออนไลน์ของ Windows หรือโปรแกรมจำลองออนไลน์ของ MAC OS

โครงการ:

ชื่อ


pt-table-usage - วิเคราะห์ว่าคิวรี่ใช้ตารางอย่างไร

เรื่องย่อ


การใช้งาน: pt-table-usage [ตัวเลือก] [ไฟล์]

pt-table-usage อ่านข้อความค้นหาจากบันทึกและวิเคราะห์ว่าพวกเขาใช้ตารางอย่างไร หากไม่มี FILE คือ
ระบุว่าจะอ่าน STDIN จะพิมพ์รายงานสำหรับแต่ละแบบสอบถาม

ความเสี่ยง


Percona Toolkit ได้รับการพัฒนา พิสูจน์แล้วในโลกแห่งความเป็นจริง และผ่านการทดสอบอย่างดี แต่ฐานข้อมูลทั้งหมด
เครื่องมือสามารถก่อให้เกิดความเสี่ยงต่อระบบและเซิร์ฟเวอร์ฐานข้อมูล ก่อนใช้เครื่องมือนี้
กรุณา:

· อ่านเอกสารประกอบของเครื่องมือ

·ตรวจสอบเครื่องมือที่เรียกว่า "BUGS"

· ทดสอบเครื่องมือบนเซิร์ฟเวอร์ที่ไม่ได้ใช้งานจริง

·สำรองเซิร์ฟเวอร์ที่ใช้งานจริงของคุณและตรวจสอบการสำรองข้อมูล

DESCRIPTION


pt-table-usage อ่านข้อความค้นหาจากบันทึกและวิเคราะห์ว่าพวกเขาใช้ตารางอย่างไร บันทึกควร
อยู่ในรูปแบบบันทึกการสืบค้นที่ช้าของ MySQL

การใช้ตารางเป็นมากกว่าการบ่งชี้ว่าตารางใดที่คิวรีอ่านหรือเขียน
นอกจากนี้ยังระบุการไหลของข้อมูล: ข้อมูลเข้าและออก เครื่องมือกำหนดการไหลของข้อมูลโดย
บริบทที่ตารางปรากฏขึ้น แบบสอบถามเดียวสามารถใช้ตารางได้หลายแบบ
บริบทพร้อมกัน ผลลัพธ์ของเครื่องมือแสดงรายการทุกบริบทสำหรับทุกตาราง นี้
รายการ CONTEXT-TABLE ระบุว่าข้อมูลไหลระหว่างตารางอย่างไร ส่วน "ผลลัพธ์" แสดงรายการ
บริบทที่เป็นไปได้และอธิบายวิธีการอ่านรายงานการใช้ตาราง

เครื่องมือจะวิเคราะห์การไหลของข้อมูลลงไปที่ระดับของแต่ละคอลัมน์ ดังนั้นจึงเป็นประโยชน์หาก
คอลัมน์จะถูกระบุอย่างชัดเจนในแบบสอบถาม หากแบบสอบถามใช้เพียงตารางเดียว ดังนั้น
ทุกคอลัมน์ต้องมาจากตารางนั้น และไม่มีปัญหา แต่ถ้าแบบสอบถามใช้
หลายตารางและชื่อคอลัมน์ไม่เข้าเกณฑ์ จึงจำเป็นต้องใช้
"EXPLAIN EXTENDED" ตามด้วย "SHOW WARNINGS" เพื่อกำหนดตารางที่คอลัมน์
เป็นของ

หากเครื่องมือไม่ทราบฐานข้อมูลเริ่มต้นของแบบสอบถาม ซึ่งสามารถเกิดขึ้นได้เมื่อฐานข้อมูล
ไม่พิมพ์ในบันทึก ดังนั้น "EXPLAIN EXTENDED" อาจล้มเหลวได้ ในกรณีนี้ คุณสามารถระบุ
ฐานข้อมูลเริ่มต้นด้วย "--database" คุณยังสามารถใช้ "--create-table-definitions"
ตัวเลือกที่จะช่วยแก้ไขความคลุมเครือ

เอาท์พุท


เครื่องมือจะพิมพ์รายงานการใช้งานสำหรับแต่ละตารางในทุกการสืบค้น ซึ่งคล้ายกับข้อมูลต่อไปนี้:

Query_id: 0x1CD27577D202A339.1
อัพเดท t1
เลือก DUAL
เข้าร่วม t1
เข้าร่วม t2
ที่ไหน t1

Query_id: 0x1CD27577D202A339.2
อัพเดท t2
เลือก DUAL
เข้าร่วม t1
เข้าร่วม t2
ที่ไหน t1

บรรทัดแรกมีรหัสการสืบค้น ซึ่งโดยค่าเริ่มต้นจะเหมือนกับที่แสดงใน pt-
รายงานสรุปข้อความค้นหา เป็นเช็คซัม MD5 ของ "ลายนิ้วมือ" ของข้อความค้นหา ซึ่งก็คืออะไร
ยังคงอยู่หลังจากลบตัวอักษร ยุบพื้นที่สีขาว และอื่น ๆ ที่หลากหลาย
การเปลี่ยนแปลง รหัสการสืบค้นมีสองส่วนโดยคั่นด้วยจุด: รหัสการสืบค้นและ
หมายเลขโต๊ะ หากคุณต้องการใช้ค่าอื่นเพื่อระบุข้อความค้นหา คุณสามารถระบุ
ตัวเลือก "--id-attribute"

ตัวอย่างก่อนหน้านี้แสดงสองย่อหน้าสำหรับแบบสอบถามเดียว ไม่ใช่สองแบบสอบถาม สังเกตว่า
รหัสแบบสอบถามจะเหมือนกันสำหรับทั้งสอง แต่หมายเลขตารางต่างกัน หมายเลขโต๊ะ
เพิ่มขึ้นทีละ 1 สำหรับแต่ละตารางที่คิวรีอัปเดต เฉพาะแบบสอบถาม UPDATE หลายตารางเท่านั้น
สามารถอัปเดตตารางได้หลายตารางด้วยแบบสอบถามเดียว ดังนั้นหมายเลขตารางจึงเป็น 1 สำหรับรายการอื่นๆ ทั้งหมด
ประเภทของแบบสอบถาม (เครื่องมือไม่สนับสนุนการสืบค้น DELETE แบบหลายตาราง) ตัวอย่าง
ผลลัพธ์ด้านบนมาจากแบบสอบถามนี้:

อัปเดต t1 เป็น เข้าร่วม t2 เป็น b ใช้ (id)
SET a.foo="bar", b.foo="bat"
โดยที่ a.id=1;

ส่วนคำสั่ง "SET" ระบุว่าแบบสอบถามอัปเดตสองตาราง: "a" นามแฝงเป็น "t1" และ "b"
นามแฝงว่า "t2"

หลังจากบรรทัดแรก เครื่องมือจะพิมพ์หมายเลขตัวแปรของบรรทัด CONTEXT-TABLE เป็นไปได้
บริบทมีดังนี้:

· เลือก

SELECT หมายความว่าแบบสอบถามดึงข้อมูลจากตารางด้วยเหตุผลสองประการ NS
ขั้นแรกจะต้องส่งคืนให้กับผู้ใช้โดยเป็นส่วนหนึ่งของชุดผลลัพธ์ เฉพาะข้อความค้นหา SELECT
ส่งคืนชุดผลลัพธ์ ดังนั้นรายงานจะแสดงบริบท SELECT สำหรับการสืบค้น SELECT เสมอ

กรณีที่สองคือเมื่อข้อมูลไหลไปยังตารางอื่นโดยเป็นส่วนหนึ่งของ INSERT หรือ UPDATE
ตัวอย่างเช่น แบบสอบถาม UPDATE ในตัวอย่างข้างต้นมีการใช้งาน:

เลือก DUAL

นี่หมายถึง:

SET a.foo="bar", b.foo="bat"

เครื่องมือนี้ใช้ DUAL สำหรับค่าใดๆ ที่ไม่ได้มาจากตาราง ในกรณีนี้คือ
ค่าตัวอักษร "bar" และ "bat" หากอนุประโยค "SET" นั้นเป็น "SET a.foo=b.foo" แทน
การใช้งานที่สมบูรณ์จะเป็น:

Query_id: 0x1CD27577D202A339.1
อัพเดท t1
เลือก t2
เข้าร่วม t1
เข้าร่วม t2
ที่ไหน t1

การมีอยู่ของบริบท SELECT หลังบริบทอื่น เช่น UPDATE หรือ INSERT
ระบุตำแหน่งที่ UPDATE หรือ INSERT ดึงข้อมูล ตัวอย่างทันที
ด้านบนแสดงถึงการสืบค้น UPDATE ที่อัปเดตแถวในตาราง "t1" ด้วยข้อมูลจาก table
"ที2"

· กริยาอื่นใด

กริยาอื่นๆ เช่น INSERT, UPDATE, DELETE เป็นต้น อาจเป็นบริบท กริยาเหล่านี้
ระบุว่าแบบสอบถามแก้ไขข้อมูลในทางใดทางหนึ่ง หากบริบท SELECT ตามหลังหนึ่งใน
กริยาเหล่านี้ จากนั้นแบบสอบถามจะอ่านข้อมูลจากตาราง SELECT และเขียนลงในสิ่งนี้
ตาราง. สิ่งนี้เกิดขึ้น เช่น กับคำสั่ง INSERT..SELECT หรือ UPDATE ที่ใช้
ค่าจากตารางแทนค่าคงที่

ไม่รองรับประเภทการสืบค้นเหล่านี้: SET, LOAD และ DELETE แบบหลายตาราง

· เข้าร่วม

บริบท JOIN แสดงรายการตารางที่เข้าร่วม ไม่ว่าจะมี JOIN ที่ชัดเจนใน
อนุประโยค FROM หรือโดยปริยายในอนุประโยค WHERE เช่น "t1.id = t2.id"

· ที่ไหน

บริบท WHERE แสดงรายการตารางที่ใช้ในส่วนคำสั่ง WHERE เพื่อกรองผลลัพธ์
ไม่รวมตารางที่เชื่อมต่อโดยปริยายในส่วนคำสั่ง WHERE; นั่นคือ
แสดงรายการเป็นบริบท JOIN ตัวอย่างเช่น:

โดยที่ t1.id > 100 และ t1.id < 200 และ t2.foo ไม่เป็นค่าว่าง

ผลการค้นหาใน:

ที่ไหน t1
ที่ไหน t2

เครื่องมือแสดงรายการเฉพาะตารางที่แตกต่างกัน นั่นคือสาเหตุที่ตาราง "t1" แสดงเพียงครั้งเดียว

· ทลิส

บริบท TLIST แสดงรายการตารางที่แบบสอบถามเข้าถึง แต่ไม่ปรากฏในใดๆ
บริบทอื่นๆ ตารางเหล่านี้มักจะเป็นการเข้าร่วมคาร์ทีเซียนโดยปริยาย ตัวอย่างเช่น
แบบสอบถาม "SELECT * FROM t1, t2" ส่งผลให้:

Query_id: 0xBDDEB6EDA41897A8.1
เลือก t1
เลือก t2
รายการ t1
รายการ t2

อย่างแรกเลย มีสองบริบท SELECT เนื่องจาก "SELECT *" เลือกแถวจากทั้งหมด
ตาราง; "t1" และ "t2" ในกรณีนี้ ประการที่สอง ตารางถูกเชื่อมต่อโดยปริยาย แต่
โดยไม่มีเงื่อนไขการเข้าร่วมใด ๆ ซึ่งส่งผลให้มีการเข้าร่วมคาร์ทีเซียนตามที่ระบุโดย
บริบท TLIST สำหรับแต่ละรายการ

EXIT สถานภาพ


pt-table-usage ออกจาก 1 เมื่อเกิดข้อผิดพลาดใด ๆ หรือ 0 หากไม่มีข้อผิดพลาด

OPTIONS


เครื่องมือนี้ยอมรับอาร์กิวเมนต์บรรทัดคำสั่งเพิ่มเติม อ้างถึง "บทสรุป" และการใช้งาน
ข้อมูลสำหรับรายละเอียด

--ขอผ่าน
ถามรหัสผ่านเมื่อเชื่อมต่อกับ MySQL

--ชุดอักขระ
แบบสั้น: -A; ประเภท: string

ชุดอักขระเริ่มต้น หากค่าเป็น utf8 ให้ตั้งค่า binmode ของ Perl บน STDOUT เป็น utf8
ส่งผ่านตัวเลือก mysql_enable_utf8 ไปยัง DBD::mysql และรัน SET NAMES UTF8 หลังจากนั้น
เชื่อมต่อกับ MySQL ค่าอื่น ๆ ตั้งค่า binmode บน STDOUT โดยไม่มีเลเยอร์ utf8
และรัน SET NAMES หลังจากเชื่อมต่อกับ MySQL

--การกำหนดค่า
ชนิด: Array

อ่านรายการไฟล์ปรับแต่งที่คั่นด้วยเครื่องหมายจุลภาค ถ้าระบุ ต้องนี่ก่อน
ตัวเลือกบนบรรทัดคำสั่ง

--constant ข้อมูลค่า
ชนิด: สตริง; ค่าเริ่มต้น: DUAL

ตารางที่จะพิมพ์เป็นแหล่งข้อมูลคงที่ (ตัวอักษร) นี่คือข้อมูลใด ๆ ไม่ใช่
ดึงมาจากตาราง (หรือแบบสอบถามย่อย เนื่องจากไม่สนับสนุนแบบสอบถามย่อย) นี้
รวมค่าตัวอักษรเช่นสตริง ("foo") และตัวเลข (42) หรือฟังก์ชันเช่น
"ตอนนี้()". ตัวอย่างเช่น ในแบบสอบถาม "INSERT INTO t (c) VALUES ('a')" สตริง 'a'
เป็นข้อมูลคงที่ ดังนั้นรายงานการใช้ตารางจึงเป็น:

แทรก t
เลือก DUAL

บรรทัดแรกบ่งชี้ว่าแบบสอบถามแทรกข้อมูลลงในตาราง "t" และวินาที
บรรทัดระบุว่าข้อมูลที่แทรกมาจากค่าคงที่บางค่า

--[ไม่]เกิดข้อผิดพลาดต่อไป
ค่าเริ่มต้น: ใช่

ทำงานต่อไปแม้ว่าจะมีข้อผิดพลาด

--สร้างคำจำกัดความของตาราง
ประเภท: array

อ่านคำจำกัดความ "สร้างตาราง" จากรายการไฟล์ที่คั่นด้วยเครื่องหมายจุลภาค ถ้าคุณ
ไม่สามารถใช้ "--explain-extended" เพื่อรับรองชื่อตารางและคอลัมน์ได้อย่างสมบูรณ์ คุณสามารถบันทึกได้
เอาต์พุตของ "mysqldump --no-data" ไปยังไฟล์อย่างน้อยหนึ่งไฟล์และระบุไฟล์เหล่านั้นด้วย
ตัวเลือกนี้ เครื่องมือจะแยกคำจำกัดความ "CREATE TABLE" ทั้งหมดจากไฟล์และ
ใช้ข้อมูลนี้เพื่อรับรองชื่อตารางและคอลัมน์ หากชื่อคอลัมน์ปรากฏใน
หลายตารางหรือชื่อตารางปรากฏในหลายฐานข้อมูล ความคลุมเครือไม่สามารถ
จะได้รับการแก้ไข

--ปีศาจ
ส้อมไปที่พื้นหลังและแยกออกจากเปลือก ระบบปฏิบัติการ POSIX เท่านั้น

--ฐานข้อมูล
แบบสั้น: -D; ประเภท: string

ฐานข้อมูลเริ่มต้น

--defaults-ไฟล์
แบบสั้น: -F; ประเภท: string

อ่านเฉพาะตัวเลือก mysql จากไฟล์ที่กำหนด คุณต้องระบุชื่อพาธที่แน่นอน

--อธิบาย-ขยาย
ชนิด: DSN

เซิร์ฟเวอร์เพื่อดำเนินการค้นหา EXPLAIN EXTENDED อาจจำเป็นต้องแก้ไข
ชื่อคอลัมน์และตารางที่คลุมเครือ (ไม่เหมาะสม)

--กรอง
ประเภท: string

ยกเลิกเหตุการณ์ที่โค้ด Perl นี้ไม่คืนค่าเป็นจริง

ตัวเลือกนี้เป็นสตริงของรหัส Perl หรือไฟล์ที่มีรหัส Perl ที่คอมไพล์แล้ว
ลงในรูทีนย่อยที่มีอาร์กิวเมนต์เดียว: $event หากค่าที่กำหนดเป็นไฟล์ที่อ่านได้
จากนั้น pt-table-usage จะอ่านไฟล์ทั้งหมดและใช้เนื้อหาเป็นโค้ด

ตัวกรองถูกนำไปใช้ในลักษณะเดียวกับในเครื่องมือ pt-query-digest ดังนั้นได้โปรด
อ้างถึงเอกสารประกอบสำหรับข้อมูลเพิ่มเติม

--ช่วยด้วย
แสดงความช่วยเหลือและออก

--เจ้าภาพ
แบบสั้น: -h; ประเภท: string

เชื่อมต่อกับโฮสต์

--id-แอตทริบิวต์
ประเภท: string

ระบุแต่ละเหตุการณ์โดยใช้แอตทริบิวต์นี้ ค่าเริ่มต้นคือการใช้รหัสการสืบค้น ซึ่งก็คือ
ผลรวมการตรวจสอบ MD5 ของลายนิ้วมือของแบบสอบถาม

--บันทึก
ประเภท: string

พิมพ์เอาต์พุตทั้งหมดไปยังไฟล์นี้เมื่อ daemonized

--รหัสผ่าน
แบบสั้น: -p; ประเภท: string

รหัสผ่านเพื่อใช้ในการเชื่อมต่อ หากรหัสผ่านมีเครื่องหมายจุลภาค จะต้องหลีกเลี่ยง
ด้วยแบ็กสแลช: "exam\,ple"

--ปิด
ประเภท: string

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

--ท่า
แบบสั้น: -P; ประเภท: int

หมายเลขพอร์ตที่ใช้เชื่อมต่อ

--ความคืบหน้า
ชนิด: อาร์เรย์; ค่าเริ่มต้น: เวลา,30

พิมพ์รายงานความคืบหน้าไปยัง STDERR ค่านี้เป็นรายการที่คั่นด้วยเครื่องหมายจุลภาคที่มีสองส่วน
ส่วนแรกอาจเป็นเปอร์เซ็นต์ เวลา หรือการวนซ้ำ ส่วนที่สองระบุว่าอย่างไร
บ่อยครั้งควรพิมพ์การอัปเดตเป็นเปอร์เซ็นต์ วินาที หรือจำนวนการทำซ้ำ

--สอบถาม
ประเภท: string

วิเคราะห์แบบสอบถามที่ระบุแทนที่จะอ่านล็อกไฟล์

--read-หมดเวลา
ประเภท: เวลา; ค่าเริ่มต้น: 0

รอเหตุการณ์จากอินพุตเป็นเวลานาน 0 เพื่อรอตลอดไป

ตัวเลือกนี้กำหนดเวลาสูงสุดในการรอเหตุการณ์จากอินพุต ถ้าเหตุการณ์คือ
ไม่ได้รับหลังจากเวลาที่กำหนด เครื่องมือหยุดอ่านอินพุตและพิมพ์
รายงาน

ตัวเลือกนี้ต้องใช้โมดูล Perl POSIX

--รันไทม์
ประเภท: เวลา

นานแค่ไหนที่จะวิ่งก่อนที่จะออก ค่าเริ่มต้นคือเรียกใช้ตลอดไป (คุณสามารถขัดจังหวะด้วย
CTRL-C)

--set-vars
ชนิด: Array

ตั้งค่าตัวแปร MySQL ในรายการคู่ "variable=value" ที่คั่นด้วยเครื่องหมายจุลภาค

โดยค่าเริ่มต้น เครื่องมือจะตั้งค่า:

wait_timeout=10000

ตัวแปรที่ระบุในบรรทัดคำสั่งจะแทนที่ค่าเริ่มต้นเหล่านี้ ตัวอย่างเช่น,
การระบุ "--set-vars wait_timeout=500" จะแทนที่ค่าเริ่มต้นที่ 10000

เครื่องมือจะพิมพ์คำเตือนและดำเนินการต่อหากไม่สามารถตั้งค่าตัวแปรได้

--เบ้า
แบบฟอร์ม; ประเภท: string

ไฟล์ซ็อกเก็ตที่ใช้สำหรับการเชื่อมต่อ

--ผู้ใช้
แบบสั้น: -u; ประเภท: string

ผู้ใช้สำหรับเข้าสู่ระบบหากไม่ใช่ผู้ใช้ปัจจุบัน

--รุ่น
แสดงเวอร์ชันและออก

DSN OPTIONS


ตัวเลือก DSN เหล่านี้ใช้เพื่อสร้าง DSN แต่ละตัวเลือกจะได้รับเช่น "option=value"
ตัวเลือกจะคำนึงถึงขนาดตัวพิมพ์ ดังนั้น P และ p ไม่ใช่ตัวเลือกเดียวกัน ไม่สามารถ
ช่องว่างก่อนหรือหลัง "=" และถ้าค่ามีช่องว่างจะต้องยกมา
ตัวเลือก DSN คั่นด้วยเครื่องหมายจุลภาค ดูหน้าคู่มือ percona-toolkit สำหรับรายละเอียดทั้งหมด

·ก

dsn: ชุดอักขระ; สำเนา: ใช่

ชุดอักขระเริ่มต้น

· NS

สำเนา: ไม่

ฐานข้อมูลเริ่มต้น

· NS

dsn: mysql_read_default_file; สำเนา: ไม่

อ่านเฉพาะตัวเลือกเริ่มต้นจากไฟล์ที่กำหนด

·ชม

dsn: โฮสต์; สำเนา: ใช่

เชื่อมต่อกับโฮสต์

· NS

dsn: รหัสผ่าน; สำเนา: ใช่

รหัสผ่านเพื่อใช้ในการเชื่อมต่อ หากรหัสผ่านมีเครื่องหมายจุลภาค จะต้องหลีกเลี่ยง
ด้วยแบ็กสแลช: "exam\,ple"

· ป

dsn: พอร์ต; สำเนา: ใช่

หมายเลขพอร์ตที่ใช้เชื่อมต่อ

· NS

dsn: mysql_socket; สำเนา: ไม่

ไฟล์ซ็อกเก็ตที่ใช้สำหรับการเชื่อมต่อ

· ยู

dsn: ผู้ใช้; สำเนา: ใช่

ผู้ใช้สำหรับเข้าสู่ระบบหากไม่ใช่ผู้ใช้ปัจจุบัน

และพวกเรา


ตัวแปรสภาพแวดล้อม "PTDEBUG" เปิดใช้งานเอาต์พุตการดีบักแบบละเอียดไปยัง STDERR การเปิดใช้งาน
การดีบักและดักจับเอาต์พุตทั้งหมดไปยังไฟล์ เรียกใช้เครื่องมือเช่น:

PDEBUG=1 pt-table-usage ... > FILE 2>&1

ระวัง: การดีบักเอาท์พุตมีจำนวนมากและสามารถสร้างเอาต์พุตได้หลายเมกะไบต์

ระบบ สิ่งที่ต้องมี


คุณต้องมี Perl, DBI, DBD::mysql และแพ็คเกจหลักบางตัวที่ควรติดตั้งในทุก
Perl เวอร์ชันใหม่พอสมควร

ใช้ pt-table-usagep ออนไลน์โดยใช้บริการ onworks.net


เซิร์ฟเวอร์และเวิร์กสเตชันฟรี

ดาวน์โหลดแอพ Windows & Linux

คำสั่ง Linux

Ad