سؤال

هل من الممكن أن يكتب الخادم عبر حدد الاستعلام باستخدام عميل الخلية. في الأساس الإعداد مثل التالي.

وخادم قاعدة البيانات 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. اختبار حتى الإخراج هو بالضبط ما تريد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top