it-swarm.asia

كيف يمكنني نقل قاعدة بيانات من خادم إلى آخر؟

كيف يمكنني نقل جداول MySQL من خادم فعلي إلى آخر؟

مثل هذا السيناريو الدقيق: لدي خادم MySQL يستخدم جدول innodb ويبلغ حجمه حوالي 20 جيجابايت.

أريد نقله إلى خادم جديد ، ما هي الطريقة الأكثر فعالية للقيام بذلك؟

142
John

طريقتي المفضلة هي توجيه أمر sqldump إلى أمر sql. يمكنك القيام بجميع قواعد البيانات أو قاعدة بيانات محددة. لذا ، على سبيل المثال ،

mysqldump -uuser -ppassword myDatabase | mysql -hremoteserver -uremoteuser -premoteserverpassword 

يمكنك القيام بجميع قواعد البيانات مع

mysqldump --all-databases -uuser -ppassword | mysql -hremoteserver -uremoteuser -premoteserver 

المشكلة الوحيدة هي عندما تكون قاعدة البيانات كبيرة جدًا وينهار الأنبوب. في هذه الحالة ، يمكنك القيام بجدول حسب الجدول أو أي من الطرق الأخرى المذكورة أدناه.

84
David Hall

لقد قمت مؤخرًا بنقل قاعدة بيانات بسعة 30 جيجابايت مع strageg التالية:

الخادم القديم

  • إيقاف خادم الخلية
  • نسخ محتويات datadir إلى مكان آخر على القرص (~/mysqldata/*)
  • ابدأ خادم mysql مرة أخرى (كان وقت التعطل 10-15 دقيقة)
  • ضغط البيانات (tar -czvf mysqldata.tar.gz ~/mysqldata)
  • نسخ الملف المضغوط إلى خادم جديد

خادم جديد

  • تثبيت الخلية (لا تبدأ)
  • ملف مضغوط بفك ضغط (tar -xzvf mysqldata.tar.gz)
  • نقل محتويات الخلية إلى datadir
  • تأكد من أن innodb_log_file_size الخاص بك هو نفسه على خادم جديد ، أو إذا لم يكن كذلك ، لا تقم بنسخ ملفات السجل القديمة ( سوف يقوم mysql بإنشاء هذه )
  • بدء الخلية
67
Derek Downey

وفقًا لـ دليل دراسة شهادة MySQL 5. ، الفصل 32 ، القسم 32.3.4 ، الصفحات 456،457 تصف شروط قابلية النقل الثنائي التي إبراز ما يلي:

إمكانية النقل الثنائي مهمة إذا كنت تريد أخذ نسخة احتياطية ثنائية تم إنشاؤها على جهاز واحد واستخدامها على جهاز آخر له بنية مختلفة. على سبيل المثال ، يعد استخدام نسخة احتياطية ثنائية طريقة لنسخ قواعد البيانات من خادم MySQL إلى آخر.

بالنسبة لـ MyISAM ، تعني إمكانية النقل الثنائية أنه يمكنك نسخ الملفات لجدول MyISAM مباشرة من خادم MySQL إلى خادم آخر على جهاز مختلف وسيتمكن الخادم الثاني من الوصول إلى الجدول.

بالنسبة إلى InnoDB ، تعني قابلية النقل الثنائي أنه يمكنك نسخ ملفات مساحة الجداول مباشرةً من خادم MySQL على جهاز واحد إلى خادم آخر على جهاز مختلف وسيتمكن الخادم الثاني من الوصول إلى مساحة الجدول. بشكل افتراضي ، يتم تخزين جميع جداول InnoDB التي يديرها الخادم معًا في مساحة الجدول ، لذا فإن إمكانية نقل مساحة الجداول هي وظيفة ما إذا كانت جميع جداول InnoDB الفردية قابلة للنقل. إذا كان جدول واحد غير محمول ، فلا مساحة الجدول.

جداول MyISAM ومساحات جداول InnoDB قابلة للنقل الثنائي من مضيف إلى آخر إذا تم استيفاء شرطين:

  • يجب أن تستخدم كلتا الماكينتين حسابًا صحيحًا مكملًا لاثنين
  • يجب أن يستخدم كلا الجهازين تنسيق الفاصلة العائمة IEEE وإلا يجب ألا تحتوي الجداول على أعمدة فاصلة عائمة (FLOAT أو DOUBLE)

عمليًا ، لا يفرض هذان الشرطان قيودًا تذكر. حساب العدد الصحيح المكمل للاثنين وتنسيق النقطة العائمة IEEE هي القاعدة في الأجهزة الحديثة. الشرط الثالث لإمكانية النقل الثنائي لـ InnoDB هو أنه يجب عليك استخدام أسماء صغيرة للجداول وقواعد البيانات. وذلك لأن InnoDB يخزن هذه الأسماء داخليًا (في قاموس البيانات الخاص به) بأحرف صغيرة على Windows. يتيح استخدام الأسماء الصغيرة إمكانية النقل الثنائية بين Windows و Unix ، لفرض استخدام الأسماء الصغيرة ، يمكنك وضع الأسطر التالية في ملف خيار:

[mysqld]
lower_case_table_names=1

إذا قمت بتكوين InnoDB لاستخدام مساحات الجداول لكل جدول ، فسيتم توسيع شروط قابلية النقل الثنائي لتضمين ملفات .ibd لجداول InnoDB أيضًا. (لا تزال شروط مساحات الجداول المشتركة سارية لأنها تحتوي على قاموس البيانات الذي يخزن معلومات حول جميع جداول InnoDB.)

إذا لم يتم استيفاء شروط قابلية النقل الثنائي ، يمكنك نسخ جداول MyISAM أو InnoDB من خادم إلى آخر عن طريق تفريغها باستخدام بعض تنسيق النص (على سبيل المثال ، مع mysqldump) وإعادة تحميلها في الخادم الوجهة.

هناك طريقتان رئيسيتان تعتمدان على محرك التخزين لنقل الجداول الفردية.

على سبيل المثال ، سنفترض ما يلي:

  1. datadir هو/var/lib/mysql
  2. قاعدة بيانات تسمى mydb
  3. جدول في mydb قاعدة بيانات تسمى mytable.

جداول MyISAM

إذا كان mydb.mytable يستخدم محرك تخزين MyISAM ، فسيظهر الجدول فعليًا كثلاثة ملفات منفصلة

  1. /var/lib/mysql/mydb/mytable.frm (ملف .frm)
  2. /var/lib/mysql/mydb/mytable.MYD (ملف .MYD)
  3. /var/lib/mysql/mydb/mytable.MYI (ملف .MYI)

يحتوي .frm على بنية الجدول
يحتوي .MYD على بيانات الجدول
تحتوي .MYI على صفحة فهرس الجدول

يتم استخدام هذه الملفات بشكل مترابط لتمثيل الجدول من وجهة نظر منطقية في الخلية. نظرًا لعدم وجود ارتباط منطقي إضافي لهذه الملفات ، يتم ترحيل جدول من خادم DB إلى آخر. يمكنك حتى ذلك من خادم Windows إلى خادم Linux أو MacOS. بالطبع ، يمكنك إيقاف تشغيل الخلية ونسخ ملفات الجدول 3. يمكنك تشغيل ما يلي:

LOCK TABLES mydb.mytable READ;
SELECT SLEEP(86400);
UNLOCK TABLES;

في جلسة ssh واحدة لعقد الجدول للقراءة فقط مع الاستمرار في القفل لمدة 24 ساعة. بعد ثانية واحدة ، قم بإجراء النسخة في جلسة ssh أخرى. ثم قم بقتل جلسة الخلية مع قفل 24 ساعة. لا تحتاج إلى الانتظار لمدة 24 ساعة.

جداول InnoDB

استنادًا إلى الاقتباس المذكور أعلاه من كتاب الشهادات ، هناك العديد من العوامل التي تحكم كيفية النسخ الاحتياطي لجدول InnoDB معين. من أجل البساطة والوضوح والإيجاز ، ببساطة قم بإجراء mysqldump للجدول المطلوب باستخدام معلمات المعاملة الواحدة للحصول على تفريغ مثالي في الوقت المناسب للجدول. لا داعي لاستخدام نفسك مع دلالات InnoDB إذا كنت تريد جدولًا واحدًا فقط. يمكنك إعادة تحميل ملف التفريغ هذا إلى أي خادم MySQL من اختيارك.

نظرًا لدمج سؤالين هنا (jcolebrand): EDIT

إذا كنت على استعداد للعيش مع بعض الأداء البطيء لقاعدة البيانات ، فيمكنك تنفيذ سلسلة من عمليات rsyncs من الخادم القديم (ServerA) إلى الخادم الجديد (ServerB) حتى أثناء تشغيل mysql على ServerA.

الخطوة 01) قم بتثبيت نفس إصدار mysql على ServerB الذي يحتوي على ServerA

الخطوة 02) على ServerA ، قم بتشغيل SET GLOBAL innodb_max_dirty_pages_pct = 0; من mysql وحوالي 10 دقائق (يؤدي هذا إلى حذف الصفحات القذرة من InnoDB Buffer Pool. كما أنه يساعد في إجراء إيقاف تشغيل الخلية بشكل أسرع) إذا كانت قاعدة بياناتك كلها MyISAM ، فيمكنك تخطي هذه الخطوة.

الخطوة 03) rsync --archive --verbose --stats --partial --progress --human-readable ServerA:/var/lib/mysql ServerB:/var/lib/mysql

الخطوة 04) كرر الخطوة 03 حتى يستغرق rsync أقل من دقيقة واحدة

الخطوة 05) service mysql stop على ServerA

الخطوة 06) قم بإجراء rsync واحد آخر

الخطوة 07) scp ServerA:/etc/my.cnf ServerB:/etc/

الخطوة 08) service mysql start على ServerB

الخطوة 08) service mysql start على ServerA (اختياري)

جربها !!!

مذكرة قانونية

يمكنك إنشاء عبد النسخ المتماثل مثل هذا. تذكر فقط أن يتم تعيين معرّف الخادم بشكل واضح في master /etc/my.cnf ورقم مختلف لمعرف الخادم في slave /etc/my.cnf

34
RolandoMySQLDBA

لا تحتاج حتى إلى mysqldump إذا كنت تقوم بنقل مخطط قاعدة بيانات كامل ، وكنت على استعداد لإيقاف قاعدة البيانات الأولى (لذا فهي متسقة عند النقل)

  1. إيقاف قاعدة البيانات (أو تأمينها)
  2. انتقل إلى الدليل حيث توجد ملفات بيانات الخلية.
  3. نقل عبر المجلد (ومحتوياته) إلى دليل بيانات mysql للملقم الجديد
  4. ابدأ النسخ الاحتياطي لقاعدة البيانات
  5. على الخادم الجديد ، قم بإصدار أمر "إنشاء قاعدة بيانات".
  6. إعادة إنشاء المستخدمين ومنح الأذونات.

لا أتذكر ما إذا كان mysqldump يتعامل مع المستخدمين والأذونات ، أو فقط البيانات ... ولكن حتى لو كان الأمر كذلك ، فهذا الطريقة أسرع من إجراء التفريغ وتشغيله. سأستخدم ذلك فقط إذا كنت بحاجة إلى تفريغ قاعدة بيانات mysql ثم إعادة إدخالها في بعض RDBMS أخرى ، إذا كنت بحاجة إلى تغيير خيارات التخزين (innodb مقابل myisam) ، أو ربما إذا كنت أقوم بتغيير النسخ الرئيسية لـ mysql (ولكن أعتقد أنني فعلت هذا بين 4 و 5 ، على الرغم من)

29
Joe

إذا كنت تريد فقط نقل جدول معين ، فجرّب:

mysqldump -u username -ppassword databasename tablename > databasename.tablename.sql

يمكنك تحديد المزيد من أسماء الجدول أعلاه ، في نفس الأمر. بمجرد اكتمال الأمر ، انقل ملف databasename.tablename.sql إلى الخادم الآخر ثم استعد باستخدام:

mysql -u username -ppassword databasename < databasename.tablename.sql

لاحظ أنه يتم إنشاء ملف .sql الخلفي باستخدام برنامج mysqldump ، ويتم الاستعادة مباشرة في mysql.

12
StanleyJohns
  1. إذا كان لديك وصول ssh يمكنك استخدام mysqldump من سطر الأوامر
  2. إذا لم يكن لديك حق الوصول إلى ssh ولكن لديك حق الوصول إلى phpMyAdmin ، يمكنك استخدامه للتصدير/الاستيراد
  3. إذا لم يكن لديك الوصول إلى phpMyAdmin ، فهناك بعض سكربتات php المفيدة التي سيتم تفريغها واستيرادها (ولكن من خلال تجربتي الخاصة ، لم أجد أحدًا موثوقًا به مثل phpMyAdmin).

قد يكون هناك هذا الاحتمال حيث يمكنك نقل ملفات قاعدة البيانات الفعلية (بالنسبة للتثبيت الخاص بي ، فهي موجودة على/var/lib/mysql) ، لكنني لست متأكدًا تمامًا من كيفية التصرف/العمل.

7
poelinca

ستحتاج إلى التوقف عن العمل. سيستغرق الأمر بعض الوقت اعتمادًا على سرعة شبكتك. سأفترض تشغيل MySQL على Linux/Unix. إليك العملية التي أستخدمها:

  1. إيقاف البرنامج الخفي على المضيف المصدر.
  2. قم بإنشاء مجلد tmp على المضيف المستهدف لتلقي الملفات.
  3. استخدم الشاشة لإنشاء جلسة عمل شل ستبقى في حالة قطع اتصال ssh الخاص بك.
  4. استخدم rsync لنقل الملفات بين المضيفين. شيء مثل: rsync -avhP source user @ targethost:/path/to/folder /
  5. قم بإجراء حالات الاختبار للتأكد من أنك لم تفقد أي شيء في عملية النقل.

ثم تابع كالمعتاد للحصول على إعداد MySQL المحلي.

* ملاحظة: يمكنك أيضًا استخدام المعلمة -c مع rsync لإضافة المجموع الاختباري إلى النقل ، ولكن هذا سيكون بطيئًا اعتمادًا على سرعة وحدة المعالجة المركزية.

5
randomx

أعتقد أن جميع الإجابات السابقة ربما تعمل بشكل جيد ، ولكن لا تعالج حقًا مسألة تعيين اسم قاعدة بيانات أثناء النقل.

هكذا فعلت ذلك مع باش:

قد تكون أفضل حالًا باستخدام rsync من scp ، ولا تضغط الملف إذا كنت تفعل ذلك كثيرًا.

على خادم المصدر:

[email protected]:~$ d=members
[email protected]:~$ mysqldump $d | gzip > $d.sql.gz
[email protected]:~$ scp -i .ssh/yourkeynamehere $d.sql.gz $sbox:$d.sql.gz

على خادم الوجهة:

[email protected]:~$ d1=members
[email protected]:~$ d2=members_sb
[email protected]:~$ mysqladmin create $d2
[email protected]:~$ cat $d1.sql.gz | gunzip |  mysql $d2

على أي من الجهازين لرؤية التقدم:

[email protected]:~$ ls *.gz 
[email protected]:~$ cat $d.sql.gz | gunzip |  less

كل هذا يفترض أن لديك تكوين MySQL ملف في دليل منزلك على كلا الجهازين وتعيين الأذونات:

$ echo "
[client]
user=drupal6
password=metoknow
Host=ord-mysql-001-sn.bananas.com
[mysql]
database=nz_drupal" > .my.cnf
$ chmod 0600 ~/.my.cnf
4
ErichBSchulz

يمكنني أن أؤكد أن طريقة DTest تعمل أيضًا للنسخ بين أوبونتو و osx.

لنسخ جميع قواعد البيانات دون الحاجة إلى القيام بأي إغراق أو ما شابه:

تأكد من أن لديك mysql نظيف من mysql (تثبيت dmg الذي تم تنزيله من mysql http://cdn.mysql.com/Downloads/MySQL-5.1/mysql-5.1.63-osx10.6-x86_64.dmg ) ، لم يتم تشغيل (هام جدًا) مطلقًا.

انسخ محتويات المجلد/var/lib/mysql/من جهاز ubuntu أعلى/usr/local/mysql/data/content على جهاز mac. للوصول إلى مجلد على جهاز أوبونتو ، كان علي استخدام Sudo ، أي:

Sudo cp /var/lib/mysql /home/foouser/mysql_data_folder
Sudo chown -R foouser /home/foouser/mysql_data_folder

قمت بنسخ المجلد باستخدام scp.

قبل البدء ، خذ نسخة من مجلد mysql على جهاز Mac للتأكد من عدم العبث بأي شيء.

بعد نسخ المجلد ، قم بما يلي على جهاز Mac:

Sudo chown -R _mysql /usr/local/mysql/data/
Sudo chgrp -R wheel /usr/local/mysql/data/
Sudo chmod -R g+rx /usr/local/mysql/data/

قم بتشغيل خادم mysql لأول مرة (من جزء التفضيلات ضمن System Preferences-> mysql). يجب الآن إعداد كافة المستخدمين وقواعد البيانات بشكل صحيح.

عمل هذا مع mysql 5.1.61 على ubuntu 64 bit 11.10 و mysql 5.1.63 على osx lion (macbook pro).

4
paalvibe

هل تقوم بنقله إلى خادم mysql آخر db؟ إذا كان الأمر كذلك ، قم بالتصدير عليه

# mysqldump -u username -ppassword database_name > FILE.sql
3
seyz4all

طريقة لينكس العامة:

/etc/init.d/mysqld stop
rsync -avz source_files destination
vi /etc/my.cnf

قم بتحرير البيانات (والمقبس) لكل من mysqld و mysqld_safe (إن أمكن) للإشارة إلى الموقع الجديد ، ثم

/etc/init.d/mysql start

لقد نشرت هذا لأنه لم يبد أحد ببساطة قائمة بأقل قدر من الخطوات للقيام بذلك ، وأشعر أنه أبسط طريقة شخصيًا.

3
seeafish

أود أن أقترح الخطوتين البسيطتين لنقل قاعدة البيانات بأكملها من خادم إلى آخر.

الخطوة 1: عمل نسخة احتياطية كاملة من قواعد البيانات في الخادم المصدر باستخدام mysqldump.

الخطوة 2: يمكنك استخدام الأمر rsync لنقل قواعد البيانات بالكامل إلى الخادم الوجهة.

2
Rudra

ربما هذه طريقة أفضل للقيام بذلك:

الإصدار 1: نسخة ملفات البيانات (MYISAM فقط)

ssh server1
service mysql stop
cd $mysql-data-dir
rsync -avz dirs-or-files server2:$mysql-data-dir
service mysql start

خدمة ssh server2 إعادة تشغيل الخلية

  • إذا كانت ملفات قاعدة البيانات الخاصة بك للقراءة فقط ، يمكنك تخطي إيقاف الخادم.

الإصدار 2: mysqldump

قم بتثبيت Pigz - على معالجات Xeon أو Opteron الحديثة ، خاصة عندما يكون لديك وحدتا معالجة أو أكثر ، فهي أسرع بكثير من gzip.

ssh server1 
mysqldump ... | pigz > backup-YYMDD.sql.gz
rsync backup-YYMDD.sql.gz server:location

ssh server2
pigz -dc location/backup-YYMDD.sql.gz | mysql ..

الإصدار: master/slave + mysqldump/file-copy

In HA environment you should use the following trick:
setup slave server & do all backups from it
before backups - do "slave stop"; 
then do version 1 or version 2

النصي:

touch full.start
mysqladmin -h slave-db stop-slave
echo "show slave status \G" | mysql -h slave-db > FULL/comfi-$NOW.master-position
/usr/bin/mysqldump -h slave-db --default-character-set=utf8 -A --opt --skip-lock-tables | pigz > "FULL/XXXX-$NOW.sql.gz"
mysqladmin -h slave-db start-slave
touch full.end

ln -fs "FULL/XXXX-$NOW.sql.gz" FULL.sql.gz

ملاحظة:

لنسخ الجداول الصغيرة استخدم:

ssh server1 الخلية مخطط الجدول | ssh server2 الخلية

2
parf