الخلية الصليب خادم استعلام تحديد
-
03-07-2019 - |
سؤال
هل من الممكن أن يكتب الخادم عبر حدد الاستعلام باستخدام عميل الخلية. في الأساس الإعداد مثل التالي.
وخادم قاعدة البيانات IP
--------- --------
1.2.3.4 اختبار
a.b.c.d اختبار
وأريد أن أكتب استعلام التي من شأنها تحديد صفوف من جدول في قاعدة بيانات اختبار على 1.2.3.4 وإدراج النتيجة في الجدول في قاعدة بيانات اختبار على a.b.c.d
خدمة بلادي على بعد أميال تقع بعيدا ولذا فإنني سوف يتم افتتاح نفق SSH لربط اثنين.
وأي مؤشرات؟
المحلول
ويمكن أن تكون mysqldump
الحل كما سبق ذكره أو هل يمكن أن حاول استخدام SELECT ... INTO OUTFILE
ثم LOAD DATA INFILE ...
الأوامر.
والخلية لديها مشغل التخزين الاتحادية التي قد تكون مفيدة لك. وإليك بعض الوثائق أكثر على ذلك HTTP: //dev.mysql كوم / وثيقة / RefMan معلومات / 5.0 / EN / متحدة-التخزين engine.html لا بد لي من أن أعترف بأنني كنت لم يكن نجاحا كبيرا مع ذلك، ولكن قد يكون العمل بالنسبة لك.
والحل الثالث سيكون للقيام بهذا العمل في التطبيق الخاص بك. قراءة في نتائج سطر الاستعلام SELECT
سطرا وINSERT
إلى خط الخادم الآخرين من خلال الخط. كنت قد واجهت بعض القضايا مع أنواع البيانات وباطل التعامل مع بهذه الطريقة بالرغم من ذلك.
نصائح أخرى
وماذا عن استخدام الجداول الاتحادية على أحد الملقمات؟ إنشاء الجداول الاتحادية على أساس الجداول البعيدة التي سوف تستخدم في الاستعلام وفقط تشغيل الاستعلام الخاص بك كما لو كانت قاعدة البيانات الخاصة بك عن المحلية. المثال التالي من الخلية الموقع
وإجراءات لاستخدام الجداول اتحادي بسيط جدا. عادة، لديك اثنين من الملقمات التي تستخدم، إما على حد سواء على المضيف نفسه أو على المضيفين مختلفة. (فمن الممكن لجدول اتحادي لاستخدام جدول آخر التي يتم إدارتها من قبل الملقم نفسه، على الرغم من أن هناك جدوى من القيام بذلك.)
أولا، يجب أن يكون لديك جدول على الملقم البعيد الذي تريد الوصول باستخدام الجدول اتحادي. لنفترض أن جدول بعيد في قاعدة البيانات الاتحادية ويعرف مثل هذا:
CREATE TABLE test_table (
id INT(20) NOT NULL AUTO_INCREMENT,
name VARCHAR(32) NOT NULL DEFAULT '',
other INT(20) NOT NULL DEFAULT '0',
PRIMARY KEY (id),
INDEX name (name),
INDEX other_key (other)
)
ENGINE=MyISAM
CHARSET=latin1;
ويستخدم المثال طاولة MYISAM، ولكن الجدول يمكن استخدام أي محرك التخزين.
وبعد ذلك، إنشاء جدول اتحادي على الملقم المحلي للوصول إلى جدول بعيد:
CREATE TABLE federated_table (
id INT(20) NOT NULL AUTO_INCREMENT,
name VARCHAR(32) NOT NULL DEFAULT '',
other INT(20) NOT NULL DEFAULT '0',
PRIMARY KEY (id),
INDEX name (name),
INDEX other_key (other)
)
ENGINE=FEDERATED
DEFAULT CHARSET=latin1
CONNECTION='mysql://fed_user@remote_host:9306/federated/test_table';
و(قبل الخلية 5.0.13، واستخدام COMMENT بدلا من CONNECTION).
ومنذ العميل الخلية يمكن الاتصال فقط إلى ملقم واحد في وقت واحد، والجواب القصير هو رقم ولكن هناك دائما وسيلة ...
والإصدارات الأخيرة من mysqldump
تدعم معلمة --where
التي يمكن استخدامها للحد من البيانات ملقاة. هذا يعني أن لديك وسيلة لتشغيل SELECT
بسيطة (أي كافة الأعمدة على طاولة واحدة) وإنتاج SQL صالح لINSERT
ذلك. يمكنك ثم الأنابيب إخراج هذا أمر mysqldump
عن الخادم المصدر إلى أمر mysql
إلى الخادم الوجهة.
وربما كنت ترغب في تضمين بعض الخيارات مثل --no-create-info
و--no-add-locks
على الأمر mysqldump
. اختبار حتى الإخراج هو بالضبط ما تريد.