يتيح تنفيذ استعلامات SELECT وINSERT على البيانات المخزّنة على خادم MySQL بعيد.
البنية
mysql({host:port, database, table, user, password[, replace_query, on_duplicate_clause] | named_collection[, option=value [,..]]})الوسيطات
| Argument | Description |
|---|---|
host:port |
عنوان خادم MySQL. |
database |
اسم قاعدة البيانات البعيدة. |
table |
اسم الجدول البعيد، أو استعلام يُمرَّر إلى MySQL كما هو (راجع تمرير استعلام بدلًا من اسم جدول). |
user |
مستخدم MySQL. |
password |
كلمة مرور المستخدم. |
replace_query |
علامة تُحوِّل استعلامات INSERT INTO إلى REPLACE INTO. القيم الممكنة:- 0 - يُنفَّذ الاستعلام على هيئة INSERT INTO.- 1 - يُنفَّذ الاستعلام على هيئة REPLACE INTO. |
on_duplicate_clause |
التعبير ON DUPLICATE KEY on_duplicate_clause الذي يُضاف إلى استعلام INSERT. لا يمكن تحديده إلا مع replace_query = 0 (إذا مرّرت replace_query = 1 وon_duplicate_clause في الوقت نفسه، فسينتج ClickHouse استثناءً).مثال: INSERT INTO t (c1,c2) VALUES ('a', 2) ON DUPLICATE KEY UPDATE c2 = c2 + 1;تكون on_duplicate_clause هنا هي UPDATE c2 = c2 + 1. راجع وثائق MySQL لمعرفة قيمة on_duplicate_clause التي يمكنك استخدامها مع عبارة ON DUPLICATE KEY. |
يمكن أيضًا تمرير الوسيطات باستخدام المجموعات المسماة. في هذه الحالة، يجب تحديد host وport كلٌّ على حدة. يُوصى بهذا الأسلوب في بيئة الإنتاج.
تُنفَّذ عبارات WHERE البسيطة مثل =, !=, >, >=, <, <= حاليًا على خادم MySQL.
أما بقية الشروط وقيد LIMIT لأخذ العينات، فتُنفَّذ في ClickHouse فقط بعد انتهاء الاستعلام إلى MySQL.
TLS/SSL
تُمرَّر بيانات اعتماد اتصال MySQL المشفّر كمفاتيح لمجموعة مسمّاة (أو كوسيطات مفتاح-قيمة):
| المعلَمة | الوصف |
|---|---|
ssl_ca_pem |
محتويات شهادة CA التي يُتحقَّق من شهادة خادم MySQL في مقابلها. |
ssl_cert_pem |
محتويات شهادة العميل، للمصادقة المستندة إلى الشهادات. |
ssl_key_pem |
محتويات المفتاح الخاص المرتبط بـ ssl_cert_pem. |
القيم هي محتويات ملفات PEM المقابلة، ويمكن نسخها إلى مجموعة مسمّاة أو إلى استعلام. وتُحجب في السجلات واستعلامات SHOW، بالطريقة نفسها التي تُحجب بها كلمات المرور.
يمكن أيضًا توفير بيانات الاعتماد نفسها كمسارات لملفات على الخادم، في ssl_ca وssl_cert وssl_key — ولكن فقط ضمن مجموعة مسمّاة محددة في ملف تهيئة الخادم، ولا يمكن تجاوز هذه القيمة في استعلام. يفتح الخادم تلك الملفات بصلاحياته الخاصة، لذا فإن قبول مسار من SQL سيسمح لأي مستخدم قادر على تعريف مصدر MySQL بفحص نظام الملفات المحلي والمصادقة باستخدام شهادة ومفتاح لا يُسمح له بقراءتهما بنفسه.
تمرير استعلام بدلًا من اسم جدول
بدلًا من اسم جدول، يمكن أن تكون الوسيطة الثالثة استعلام SELECT يُمرَّر إلى MySQL كما هو. ويُستدل على بنية الجدول الناتج من نتيجة الاستعلام. ويمكن كتابة الاستعلام إما على شكل استعلام فرعي، أو تغليفه داخل الدالة query:
SELECT * FROM mysql('localhost:3306', 'test', (SELECT a, b FROM t1 JOIN t2 USING (id) WHERE a > 0), 'user', 'password');
SELECT * FROM mysql('localhost:3306', 'test', query('SELECT a, b FROM t1 JOIN t2 USING (id) WHERE a > 0'), 'user', 'password');يفيد هذا في دفع عمليات الربط والتجميع أو أي معالجة أخرى إلى MySQL. ويكون هذا الجدول للقراءة فقط: لا يُسمح بإجراء INSERT فيه. كما يدعم محرّك الجدول MySQL البنية نفسها.
يدعم عدة نُسخ متماثلة يجب إدراجها باستخدام |. على سبيل المثال:
SELECT name FROM mysql(`mysql{1|2|3}:3306`, 'mysql_database', 'mysql_table', 'user', 'password');أو
SELECT name FROM mysql(`mysql1:3306|mysql2:3306|mysql3:3306`, 'mysql_database', 'mysql_table', 'user', 'password');القيمة المُعادة
كائن جدول له الأعمدة نفسها الموجودة في جدول MySQL الأصلي.
أمثلة
جدول في MySQL:
mysql> CREATE TABLE `test`.`test` (
-> `int_id` INT NOT NULL AUTO_INCREMENT,
-> `float` FLOAT NOT NULL,
-> PRIMARY KEY (`int_id`));
mysql> INSERT INTO test (`int_id`, `float`) VALUES (1,2);
mysql> SELECT * FROM test;
+--------+-------+
| int_id | float |
+--------+-------+
| 1 | 2 |
+--------+-------+استخراج البيانات من ClickHouse:
SELECT * FROM mysql('localhost:3306', 'test', 'test', 'bayonet', '123');أو باستخدام المجموعات المُسمّاة:
CREATE NAMED COLLECTION creds AS
host = 'localhost',
port = 3306,
database = 'test',
user = 'bayonet',
password = '123';
SELECT * FROM mysql(creds, table='test');┌─int_id─┬─float─┐
│ 1 │ 2 │
└────────┴───────┘enable_compression
يُفعّل الضغط لاتصال بروتوكول MySQL.
القيمة الافتراضية: false.
ينطبق هذا الإعداد على:
- دالة الجدول
mysql; - محرك الجدول
MySQL; - محرك قاعدة البيانات
MySQL; - المجموعات المسماة المستخدمة في تكاملات MySQL.
عند تفعيل هذا الإعداد، يطلب ClickHouse ضغط الاتصال.
مثال:
SELECT *
FROM mysql(
'mysql80:3306',
'clickhouse',
'test_table',
'root',
'password',
SETTINGS enable_compression = 1
);الاستبدال والإدراج:
INSERT INTO FUNCTION mysql('localhost:3306', 'test', 'test', 'bayonet', '123', 1) (int_id, float) VALUES (1, 3);
INSERT INTO TABLE FUNCTION mysql('localhost:3306', 'test', 'test', 'bayonet', '123', 0, 'UPDATE int_id = int_id + 1') (int_id, float) VALUES (1, 4);
SELECT * FROM mysql('localhost:3306', 'test', 'test', 'bayonet', '123');┌─int_id─┬─float─┐
│ 1 │ 3 │
│ 2 │ 4 │
└────────┴───────┘نسخ البيانات من جدول في MySQL إلى جدول في ClickHouse:
CREATE TABLE mysql_copy
(
`id` UInt64,
`datetime` DateTime('UTC'),
`description` String,
)
ENGINE = MergeTree
ORDER BY (id,datetime);
INSERT INTO mysql_copy
SELECT * FROM mysql('host:port', 'database', 'table', 'user', 'password');أو عند نسخ دفعة تدريجية فقط من MySQL استنادًا إلى أكبر قيمة id حالية:
INSERT INTO mysql_copy
SELECT * FROM mysql('host:port', 'database', 'table', 'user', 'password')
WHERE id > (SELECT max(id) FROM mysql_copy);