আমি কীভাবে একটি বড় .sql ফাইলের আমদানির অগ্রগতি পর্যবেক্ষণ করতে পারি?


204

foobar.sqlস্থানীয় ডাটাবেসে একটি সারণী পুনরুদ্ধার করতে আমি 7 গিগাবাইট আমদানি করছি ।

$ mysql -h localhost -u root 'my_data' < foobar.sql

$ mysql --version
/usr/local/mysql/bin/mysql  Ver 14.12 Distrib 5.0.96, for apple-darwin9.8.0 (i386) using readline 5.1

আমি কীভাবে এর অগ্রগতি পর্যবেক্ষণ করতে পারি?


1
এই প্রশ্নের উত্তরগুলি দেখায় যে এটি
মাইএসকিএল

উত্তর:


267

যদি আপনি কেবল * নিক্সের সিএলআই থেকে ডাম্প ফাইল থেকে আমদানি করে থাকেন, যেমন

mysql -uxxx -pxxx dbname < /sqlfile.sql

তারপরে প্রথমে আপনার ওএসে পাইপ ভিউয়ার ইনস্টল করুন তারপরে এমন কিছু চেষ্টা করুন:

pv sqlfile.sql | mysql -uxxx -pxxxx dbname

যা প্রোগ্রামটি চলাকালীন একটি অগ্রগতি বার দেখায়।

এটি খুব দরকারী এবং আপনি মাইএসকিএলডাম্প অগ্রগতির জন্য অনুমান পেতে এটি ব্যবহার করতে পারেন।

পিভিগুলি ডাম্পগুলি ফেলে sqlfile.sqlএবং এগুলি মাইএসকিএলে যায় (পাইপ অপারেটরের কারণে)। এটি ডাম্পিং করার সময়, এটি অগ্রগতি দেখায়। দুর্দান্ত জিনিসটি হ'ল মাইএসকিএল ডেটা কেবল তত দ্রুত গ্রহণ করে যত তা অগ্রগতি করতে পারে, সুতরাং পিভি আমদানির অগ্রগতি প্রদর্শন করতে পারে। আমার কোন প্রমাণ নেই। তবে তাই মনে হচ্ছে। আমি অনুমান করি যে এখানে কিছু বাফার ব্যবহৃত হয়েছে, তবে কিছু সময় আমি মনে করি mysqlএটি এখনও প্রক্রিয়াতে ব্যস্ত থাকাকালীন আর কোনও ডেটা পড়বে না।

পাইপ দর্শকের স্ক্রিনশট


1
আমি অনুমান করব যে মাইএসকিএল-তে একটি বাফার থাকতে পারে, যাতে সম্পূর্ণ "প্রক্রিয়াজাত" না হয়ে কিছু তথ্য পাইপ করা যায় (যেমন যদি এটি ত্রুটি থেকে বেরিয়ে আসে তবে পিভি আসলে কিছুটা ওপরে রিপোর্ট করে থাকতে পারে) আসলে কী ঘটেছিল)। তবে সাধারণভাবে পাইপগুলি এভাবে কাজ করে। এটি একই কারণে আপনি করতে পারেন sudo hd /dev/sda1 | lessএবং মেমরিতে আপনার পুরো সিস্টেম পার্টিশনটি নেই।
স্ন্যাপফ্র্যাকলাপ্প

2
@ স্নাপফ্র্যাক্টলপপ pvঅনেক ক্ষেত্রে অতিরিক্ত মাত্রায় নির্ভুল হবে না কারণ এসকিউএল-এর কিছু অংশ অন্যদের চেয়ে প্রক্রিয়া করতে বেশি সময় নেবে। একটি সরল সন্নিবেষ্টকারী একটি লাইন উদাহরণস্বরূপ, ইতিমধ্যে অনেক সারি রয়েছে এমন একটি টেবিলের সূচীতে তৈরি হওয়া চেয়ে অনেক দ্রুত চলবে। তবে অগ্রগতির মোটামুটি ধারণা আউটপুটটি সহায়ক হওয়া উচিত যদি না ব্যবহৃত রিড বাফারটি mysqlবিশেষত বড় না হয় (7 জিবি ইনপুটটির জন্য বাফারের pvআউটপুটটি কোনও উপযোগী না করে রেন্ডার করতে খুব বড় হওয়া দরকার
ডেভিড স্পিলিট

1
@ ডেভিডস্পিলিট সত্যিই আপনার মন্তব্য আমার অনুভূতি আয়না। মূলত, পিভি অশোধিত, তবে কার্যকর। আমি এটি সম্পর্কে সবচেয়ে বেশি পছন্দ করি তা হ'ল এটি সাধারণ। এটি ইউনিক্স পাইপগুলির সৌন্দর্য (ধন্যবাদ ম্যাকল্রয়িকে)।
স্নাপফ্র্যাক্টলপপ

1
@rob এই দুর্দান্ত বন্ধু, আপনি কি উদাহরণ দিয়ে দিতে পারেন mysqldump?
জোসে আলেকজান্ডার ইবাররা

খুব সুন্দর সমাধান! যদি পাসওয়ার্ডটি ম্যানুয়াল হয়, পিভি তার অগ্রগতি প্রদর্শিত হওয়ার জন্য অপেক্ষা করে না
পিয়েরে লেস্পিনে

26

যদি আপনি ইতিমধ্যে আমদানি শুরু করেছেন, আপনি আপনার ডাটাবেসের বর্তমান আকার দেখতে অন্য উইন্ডোতে এই কমান্ডটি কার্যকর করতে পারেন। আপনি আমদানি করে থাকা .sql ফাইলের মোট আকার জানলে এটি সহায়ক হতে পারে।

SELECT table_schema "Data Base Name", sum( data_length + index_length ) / 1024 / 1024 "Data Base Size in MiB" 
FROM information_schema.TABLES GROUP BY table_schema;  

ক্রেডিট: http://forums.mysql.com/read.php?108,201578,201578


মাইএসকিউএল 8.0 রেফারেন্স রাজ্যের সঠিকতা সম্পর্কে নিম্নলিখিত:

DATA_LENGTH

মাইআইএসএএম-এর জন্য, ডেটা_লেএনজিএইচটি হ'ল ডেটা ফাইলের দৈর্ঘ্য বাইটে।

InnoDB এর জন্য, DATA_LENGTH হ'ল ক্লাস্টারড ইনডেক্সের জন্য বাইটে মেমরির পরিমাণ নির্ধারিত। বিশেষত, এটি পৃষ্ঠাগুলিতে ক্লাস্টারড ইনডেক্স আকার, ইনোডিবি পৃষ্ঠার আকার দ্বারা গুণিত।

 

INDEX_LENGTH

মাইআইএসএএম-এর জন্য, আইএনডিএক্সএইএলএক্স_এলএনজিএইচটি হ'ল সূচি ফাইলটির দৈর্ঘ্য বাইটে।

InnoDB- এর জন্য, INDEX_LENGTH হ'ল আন-ক্লাস্টারযুক্ত সূচিগুলির জন্য বাইটে মেমরির আনুমানিক পরিমাণ। বিশেষত, এটি পাতায় নন-ক্লাস্টারড ইনডেক্স আকারের যোগফল, ইনোডিবি পৃষ্ঠার আকার দ্বারা গুণিত।


আমার উত্তর সারণীটি এখন 12 জিআইবিতে রয়েছে উত্তরটির আদেশ অনুসারে এবং এখনও আমদানি করছে। আমার স্কেলডাম্প ফাইলটি কেবল 5 জিআইবি। আমি এই
তাত্পর্যটির

17

আপনি যখন একটি একক ডাটাবেসের একটি মাইএসকিলডাম্প চালান, সমস্ত টেবিলগুলি বর্ণানুক্রমিক ক্রমে ফেলে দেওয়া হয়।

স্বাভাবিকভাবেই, মাইএসকিল্ডাম্পের একটি ডেটাবেজে পুনরায় লোডও বর্ণানুক্রমিক ক্রমে হবে।

আপনি কেবল একটি শো প্রসেসলিস্ট করতে পারেন; এবং মাইএসকিএলড্পটি চালাচ্ছে ডিবি সংযোগটি সন্ধান করুন। যখন ডাম্পটি আবার লোড হবে, তখন ডিবি সংযোগটি বিলুপ্ত হবে।

আপনি যদি ডাম্পফাইলে কী টেবিলগুলি জানতে চান তা foobar.sql এর বিরুদ্ধে চালান

cat foobar.sql | grep "^CREATE TABLE" | awk '{print $3}'

আপডেট 2012-05-02 13:53 ইডিটি

কেবলমাত্র একটি টেবিল রয়েছে তা লক্ষ্য করে দুঃখিত।

যদি টেবিলটি মাইআইএসএএম হয় তবে ওএস দৃষ্টিকোণ থেকে নিরীক্ষণের একমাত্র উপায়। কারন? পুনরায় লোড জুড়ে টেবিলটি লিখিত-লক করা আছে। তুমি কি খুঁজছো? আকার .MYDএবং .MYIফাইল। অবশ্যই, আপনি অন্য ডিবি সার্ভার থেকে আমদানি করে টেবিলের আকারটি আগে যা ছিল তার সাথে এটি তুলনা করতে হবে।

যদি টেবিলটি InnoDB হয় এবং আপনার ইনোডোবি_ফাইলে_পিটার_সেবদ্ধ সক্ষম করা থাকে তবে ওএস দৃষ্টিকোণ থেকে নিরীক্ষণের একমাত্র উপায়। কারন? পুনরায় লোড জুড়ে টেবিলটি লিখিত-লক করা আছে। তুমি কি খুঁজছো? .ibdফাইলের আকার । অবশ্যই, আপনি অন্য ডিবি সার্ভার থেকে আমদানি করে টেবিলের আকারটি আগে যা ছিল তার সাথে এটি তুলনা করতে হবে।

যদি টেবিলটি InnoDB হয় এবং আপনার ইনডোডবি_ফাইলে_পিটার_ট্যাবল অক্ষম থাকে তবে ওএস দৃষ্টিকোণও সহায়তা করতে পারে না।

আপডেট 2012-05-02 13:56 ইডিটি

আমি গত বছরের মতো কিছুকে সম্বোধন করেছি: "টাইপ ডিবি.এসকিএল | মাইএসকিএল" এর জন্য আমি কীভাবে% অগ্রগতি লাভ করব?

আপডেট 2012-05-02 14:09 ইডিটি

যেহেতু একটি স্ট্যান্ডার্ড মাইএসকিल्डম্প লেখার তালিকাকে এভাবে লক করে রাখে:

LOCK TABLES `a` WRITE;
/*!40000 ALTER TABLE `a` DISABLE KEYS */;
INSERT INTO `a` VALUES (123),(451),(199),(0),(23);
/*!40000 ALTER TABLE `a` ENABLE KEYS */;
UNLOCK TABLES;

তারপরে, টেবিল লকটি প্রকাশ না হওয়া পর্যন্ত মাইএসকিএল দিয়ে অগ্রগতি পাওয়ার কোনও উপায় নেই।

আপনি পেতে পারেন, তাহলে LOCK TABLESএবং UNLOCK TABLESdumpfile বাইরে মন্তব্য ...

  • যদি টেবিলটি মাইআইএসএএম হয়, নির্বাচন করুন COUNT (*) কাজ করবে
  • যদি টেবিলটি InnoDB হয়, নির্বাচন করুন COUNT (*) সম্ভবত গণনা শেষ না হওয়া অবধি লোডটি ধীর করে / থামিয়ে দেবে

কাজ করেছে। ধন্যবাদ। একটি শেষ প্রশ্ন, অভিজ্ঞতার দ্বারা, আপনি কি জানবেন যে আমদানি করার সময়টি ফাইল এবং আকারগুলির সাথে সামঞ্জস্য রেখে প্রায় লিনিয়ার হয় ? .MYD.MYI
qazwsx

1
সারণী পুনরায় লোড লিনিয়ার। সূচি পুনর্নির্মাণগুলি লিনিয়ার are কয়েক বছর আগে, আমি মাইএসকিউএল ( list.mysql.com/mysql/202489 ) এর প্রশ্ন হিসাবে এটি উত্সাহিত করার মতো ছিল না এবং আমি এটি ডিবিএ স্ট্যাকএক্সচেঞ্জে ( dba.stackexchange.com/a/2697/877 ) উল্লেখ করেছি
রোল্যান্ডোমাইএসকিউএলডিবিএ

8

প্রতি 2 সেকেন্ডে আপনি দেখতে পাবেন যে প্রক্রিয়াগুলি চলছে।

watch 'echo "show processlist;" | mysql -uuser -ppassword';

যদি আপনি এটি কম ঘন ঘন চান তবে x সেকেন্ডের সংখ্যা -n xযেখানে যোগ করুন । 5 সেকেন্ড হবে:

watch -n 5 'echo "show processlist;" | mysql -uuser -ppassword';

আপনি একটি উদাহরণ আউটপুট পোস্ট করতে পারেন? এছাড়াও, এটি কি কেবল প্রক্রিয়াটি দেখায় বা এটি সত্যিই আমদানির অগ্রগতি নির্দেশ করে যা সত্যই আমি জিজ্ঞাসা করছিলাম?
qazwsx

এটি এমন একটি সহায়ক কোড। আপনাকে ধন্যবাদ
নারায়ণ

6

আপনি যদি এটি স্থগিত হয়ে থাকেন কিনা তা পরীক্ষা করতে চান তবে আপনি জিজ্ঞাসা করতে পারেন

show processlist; 

এবং দেখুন কি কার্যকর করা হচ্ছে।


5

যে কেউ পিভি কাজ করতে পারে না বা যার পক্ষে পিভি মিথ্যা বলে তার সমাধান হিসাবে। আপনি / var / lib / mysql এ আইবডটা 1 ফাইলের আকারটি নিরীক্ষণ করতে পারেন যাতে ডেটা রয়েছে। এটি আপনার উত্স সার্ভারে ফাইল সাইজের একই আকার (বা তল্লাশি) শেষ করবে।

যদি অনেকগুলি সারণী থাকে তবে আপনি সেগুলিকে একবারে / var / lib / mysql / <ডাটাবেস নাম> এ প্রদর্শিত দেখতে পারেন।

আমি এই বাস্তবতাটি সম্প্রতি ব্যবহার করতে গিয়েছিলাম যখন একটি দীর্ঘমেয়াদী ডাটাবেস তিন বা চার বছরের সময়কালে প্রায় 20G এর লগ ফাইল তৈরি করেছিল। আমি লক্ষ্য করেছি যে স্থানান্তরটি যুগে যুগে সময় নিয়েছে এবং অগ্রগতি পর্যবেক্ষণ করতে এই কৌশলটি ব্যবহার করেছে।

আমি মনে করি যে ডেটাবেস কোথাও বা অন্য কোনও ফাইলের সাথে জড়িত না হলে এই দিনটি ভোর হওয়ার খুব সম্ভাবনা নেই। এদিকে, স্থানান্তর কীভাবে চলছে তা দেখতে আপনি ফাইলটি পর্যবেক্ষণ করতে পারেন। আমি যে পদ্ধতিটি পরামর্শ দিয়েছিলাম তা হ'ল প্রথম স্কল ডাটাবেসটি লেখার পর থেকে আপনি কোনও ফর্ম বা অন্য কোনও ক্ষেত্রে করতে পারেন could আমি কখনই পরামর্শ দেওয়ার ইচ্ছা করি নি যে এটি কোনও ধরণের "অফিসিয়াল" কৌশল যা ম্যানুয়াল জকি ফিরে আসতে পারে। এটি সাধারণভাবে কম্পিউটার এবং বিশেষত ইউনিক্সের সাথে একটি সাধারণ স্তরের দক্ষতা গ্রহণ করে।


2

যদি আপনার ডিবি অন্যথায় শান্ত থাকে (যেমন অন্যান্য ব্যবহারকারী সক্রিয় নেই) এবং আপনি কেবল পড়ার / লেখার ক্রিয়াকলাপ দেখতে চান তবে কেন এমন কিছু করবেন না:

mysqladmin -h<host>-uroot -p<yourpass> extended -r -i 10 |grep 'row'

আপনি পঠন / লেখক / সন্নিবেশ / অপেক্ষার / আপডেটের সংখ্যা দেখতে পাবেন।

আপনি উদাহরণস্বরূপ সন্নিবেশ করানো হলে আপনি এমন কিছু দেখতে পাবেন:

Innodb_rows_inserted                          | 28958 

যেখানে 28958 হ'ল আপনার বিরতিতে myোকানো সারিগুলির সংখ্যা (আমার ক্ষেত্রে 10 সেকেন্ড)।


1

আপনি যে কেউ পাইপ দর্শকের উদাহরণ ব্যবহার করে সন্ধান mysqldumpকরছেন তার জন্য আপনি ঠিক এইরকম কিছু করছেন:

mysqldump -hxxx -uxxx -p dbname | pv -W > dump.sql

-Wপতাকা মাত্র PV বলে প্রথম বাইট জন্য উন্নতি (প্রম্পট পরে) দেখানোর আগে আসতে অপেক্ষা করতে


0

আপনি Import এমএসকিএল \ ডেটা [ডিবি নাম] ফোল্ডারে কোনও আমদানি পর্যবেক্ষণ করতে পারেন


0

ঠিক আছে, প্রায় অন্য কাজ। তবে এটি হতে পারে সবচেয়ে খারাপ এবং অসম্পূর্ণ বিকল্প।

এটি বলেছিল, উইন্ডোজের জন্য আমার সমাধানটি এখানে:

টাস্ক ম্যানেজার টিপুন টিপুন

CTRL + SHIFT + ESC

"Mysqld.exe" ডিস্ক মান গতি অনুলিপি করুন

e.g. 11mb/s

এটির মতো একটি ক্যালকুলেটরে রাখুন: https://techinternets.com/copy_calc?do

ইটিএ অনুমান করুন। আমার কেসটি ছিল:

Speed: 8 MB/s
Size: 4.9 GB
0 Hours, 11 Minutes and 29 Seconds

ফলাফল:

Beg -> 11:19
ETA -> 11:31
End -> 11:39

-1

আমি এত অবাক হয়েছি যে কেউ 'বিকল্প হিসাবে' মাইএসকিএল-ভি 'পোস্ট করেনি। যদি এটি আটকে যায় তবে আউটপুট বন্ধ হয়ে যাবে।


3
"অগ্রগতি পর্যবেক্ষণ করা" এর অর্থ সাধারণত প্রক্রিয়াটি কতদূর এগিয়ে গেছে বা কখন এটি সম্পন্ন mysql -vহবে , যা অফার করবে না তা অনুমান করার চেষ্টা করা । এছাড়াও, টার্মিনালে 7 গিগাবাইট ডেটা বানান পুনরুদ্ধারটি উল্লেখযোগ্যভাবে কমিয়ে দেবে।
mustaccio

আমি দেখুন, ব্যাখ্যা জন্য ধন্যবাদ। সত্য যে সত্য, 7 গিগাবাইট আউটপুট টার্মিনাল আউটপুট ভাল হবে না। আমি অনুমান করি আমাকে -v ব্যবহার করা কেবলমাত্র একটি ছোট্ট স্থানীয় পরীক্ষার ক্ষেত্রে যেখানে আমার ডিবি আটকে যাবে।
dtc

2
এই পরামর্শটি আমাকে একটি সমস্যা চিহ্নিত করতে সহায়তা করেছে, তবে এটি বড় ফাইলগুলির সাথে ব্যবহারের ক্ষেত্রে অযৌক্তিক হতে পারে। (আমার ছিল ছোট)।
কেসি পার্কিনস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.