সারণি লক না করেই মাইএসকিউএলডাম্প চালান


437

আমি আমার স্থানীয় বিকাশ ডাটাবেসে একটি লাইভ উত্পাদন ডাটাবেস অনুলিপি করতে চাই। উত্পাদনের ডেটাবেস লক না করে এটি করার কোনও উপায় আছে কি?

আমি বর্তমানে ব্যবহার করছি:

mysqldump -u root --password=xxx -h xxx my_db1 | mysql -u root --password=xxx -h localhost my_db1

তবে এটি চলার সাথে সাথে প্রতিটি টেবিলটি লক করছে।


আর একটি দেরিতে সমাধান: আপনি লেনদেন প্রক্রিয়াজাতকরণ সম্পর্কিত কোনও বাধা ছাড়াই আপনার উত্পাদন ডেটাবেস ডাম্প করতে পারকোনা এক্সট্রাব্যাকআপ ব্যবহার করতে পারেন। এটি একটি গরম ব্যাকআপ করতে দেয়, অর্থাত্ এটি বর্তমান সক্রিয়তাকে প্রভাবিত করে না। এখানে দেখুন: পেরকোনা.সোফটওয়্যার / মাইসকিএল- ডেটাবেস / স্পেরকোনা-টেক্সটব্যাকআপ ( পারকোনার সাথে আমার কোনওভাবেই কোনও সম্পর্ক নেই।)
ডেলেক্স

উত্তর:


625

কি --lock-tables=falseবিকল্প কাজ করে?

ম্যান পেজ অনুসারে , আপনি যদি InnoDB টেবিলগুলি ডাম্প করছেন তবে আপনি --single-transactionবিকল্পটি ব্যবহার করতে পারেন :

--lock-tables, -l

Lock all tables before dumping them. The tables are locked with READ
LOCAL to allow concurrent inserts in the case of MyISAM tables. For
transactional tables such as InnoDB and BDB, --single-transaction is
a much better option, because it does not need to lock the tables at
all.

জন্য InnoDB ডিবি :

mysqldump --single-transaction=TRUE -u username -p DB

23
ইনোডাবড ডিবি মাইসক্ল্ড্প্পের জন্য --single- লেনদেন = সত্য
এএমবি

19
আপনার যদি ইনোডাব এবং মাইসাম থাকে?
সিএমসিডিগ্রাগনকাই

এটি কি ডিফল্টরূপে চালু আছে?
সিএমসিডিগ্রাগনকাই

স্পষ্টতই (মানে লকড)?
ইভানড্রিক্স

290

এটি যুগে যুগে অনেক দেরি হয়ে গেছে তবে বিষয়টির সন্ধান করছে এমন যে কেউ তার পক্ষে ভাল। আপনি যদি নির্দোষ হন না, এবং ডাম্প করার সময় আপনি লক সম্পর্কে উদ্বিগ্ন না হন তবে বিকল্পটি ব্যবহার করুন:

--lock-tables=false

1
প্রতিক্রিয়াটির জন্য ধন্যবাদ ওয়ারেন, এটি খুব সহায়ক ছিল এবং একটি কবজির মতো কাজ করেছিল worked
গাভিন

7
'- লক-টেবিল = মিথ্যা - প্রশ্ন' ব্যবহার করে সর্বনিম্ন সার্ভার রিসোর্স ব্যবহার করা হয়
সিনট্যাক্সগুনু

43
তবে আপনার টেবিল লক করার বিষয়ে চিন্তিত হওয়া উচিত । মাইএসকিলডাম্প চলার সময় যদি একাধিক টেবিল লিখিত হয় (এবং আপনি বিদেশী কী ব্যবহার করেন) তবে আপনি ডাম্পগুলি বেমানান হতে পারেন। আপনি এটি পুনরুদ্ধার না করা এবং অসঙ্গত ডেটাতে JOIN কোয়েরি চালানো না হওয়া পর্যন্ত আপনি জানেন না। অসঙ্গতিপূর্ণ ডেটা আবিষ্কার করতে কিছুটা সময় লাগতে পারে কারণ জোইনগুলি আপনার অ্যাপ্লিকেশনটি মাইএসকিএল নয় (মাইআইএসএএম টেবিল সহ) ব্যবহার করে; পুনরুদ্ধার ঠিক কাজ করবে, মাইএসকিএল আপনাকে অসঙ্গতি সম্পর্কে সতর্ক করবে না। সুতরাং: মাই আইসাম -> সর্বদা আপনার টেবিলগুলি লক করুন। InnoDB -> ব্যবহার --single-transaction
কোস্টা

12
@ কোস্টা আমি মনে করি না মাইআইএসএএম টেবিলের জন্য টেবিলগুলি লক করা যথেষ্ট। যদি মাইএসকিলডাম্প অ্যাপ্লিকেশন দ্বারা সম্পাদিত প্রশ্নের মধ্যে টেবিলগুলি লক করে রাখে তবে আপনি একই অসঙ্গতিগুলি দিয়ে শেষ করতে পারেন। উত্তরটি আরও সহজ: মাইআইএসএএম -> পরিবর্তে ইনোডিবি ব্যবহার করুন।
cdowie

@ কোস্টা আপনার অবশ্যই অবশ্যই লকিং টেবিলগুলি সম্পর্কে উদ্বিগ্ন হওয়া উচিত তবে কেবল আপনার যদি ধারাবাহিক ডাম্পের প্রয়োজন হয় । কিছু বিরল ঘটনা যখন আপনি না করেন। উদাহরণস্বরূপ, ডাটাবেস-বিস্তৃত ডাম্প (ডিবাগিং) এ একটি অশোধিত fgrep: আমি বাজি ধরেছি যে ব্যবহারকারীরা উত্পাদন ডাটাবেসের ডাম্প তৈরি করার জন্য 20 মিনিটের জন্য অপেক্ষা না করে (সত্য গল্প)। যদি বিন্দুটি কেবল এএসএপিই নয়, তবে কনসিস্টেন্টেরও ডাম্প পেতে হয় তবে স্টাফটিকে মাথায় রেখে রেপ্লিকেটেড ক্রীতদাসকে ডাম্প করা বা নিম্ন-স্তরের স্ন্যাপশ্যাটিং (lvm, zfs, btrfs, ইত্যাদি) ব্যবহার করা উচিত FLUSH TABLES WITH READ LOCK
অ্যালেক্স অফশোর

44

আপনি কোন স্টোরেজ ইঞ্জিন ব্যবহার করছেন তার উপর নির্ভর করে উত্তরটি পরিবর্তিত হয়। আপনি যদি InnoDB ব্যবহার করছেন তবে আদর্শ দৃশ্যটি। সেক্ষেত্রে আপনি --single-transactionপতাকাটি ব্যবহার করতে পারেন যা ডাম্প শুরু হওয়ার সাথে সাথে আপনাকে ডাটাবেসের একটি সুসংগত স্ন্যাপশট দেবে।


35

--skip-add-locks আমার জন্য সাহায্য


2
অথবা অন্যান্য অপ্টিমাইজেশনের সাথে স্কিপ লকগুলি অন্তর্ভুক্ত করার জন্য - কমপ্যাক্ট।
ppostma1

77
এটি ডাম্প ফাইল থেকে লক ট্যাবলেট এবং আনলক ট্যাবলেট বিবৃতি সরিয়ে দেয়, এটি রফতানির সময় লকিংয়ের উপর প্রভাব ফেলবে না।
ডাবিস্ট 1

11
না, আপনি যা খুঁজছেন তা নয়! ডাবিস্ট 1 এর মন্তব্য দেখুন। এটি কোনও মাইএসকিল্ডম্প করার সময় আপনার টেবিলগুলিকে লক হওয়ার হাত থেকে রক্ষা করার জন্য কিছুই করে না। এটি প্রশ্নের উত্তর নয়।
23-22 এ অর্ডার

@ ড্যাবেস্ট এবং @ আরর্ড সঠিক: --skip-add-locksকেবলমাত্র ডাম্পটিকে দ্রুত পুনরুদ্ধার করা হবে। এই না একটি সঠিক উত্তর।
dr_

16

বড় টেবিলগুলি ডাম্প করতে, আপনাকে --quick এর সাথে একসেল-লেনদেনের বিকল্পটি একত্রিত করতে হবে।

http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_single-transaction


2
অপশন - কুইক এখন --opt অপশনের অংশ। এবং --opt ডিফল্টরূপে সক্ষম হয়।
আলেকজান্ডার উশাকভ

11

InnoDB টেবিলের জন্য পতাকা ব্যবহার করুন --single-transaction

এটি কোনও অ্যাপ্লিকেশনকে অবরুদ্ধ না করেই যখন শুরু করা হয়েছিল তখন এটি ডাটাবেসের সামঞ্জস্যপূর্ণ স্থিতি ফেলে দেয়

মাইএসকিউএল ডকস

http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_single-transaction


পাশাপাশি হতে পারে --skip-lock-tables
জাভি মন্টেরো

10

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

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

সুতরাং হয় টেবিলগুলি লক করুন বা প্রতিলিপি ব্যবহার করুন।


এই সম্পূর্ণ ডিবিটি কেবলমাত্র সম্পূর্ণরূপে পঠিত তাই আমি এটি পরিবর্তনের বিষয়ে খুব বেশি চিন্তিত নই।
গ্রেগ

2
এই মন্তব্যটি ভুল। এমভিসিসি ইনোডিবিতে লক ছাড়াই ধারাবাহিক অবস্থা পড়ার অনুমতি দেয়।
স্কট হেন্ডম্যান

5
আপনার যদি ইতিমধ্যে প্রতিলিপি সেট আপ না করে থাকে, তবে এটি সেট আপ করার জন্য আপনাকে একটি ডাম্প করতে হবে। একই সমস্যা বিদ্যমান।
ম্যাট কনোলি

3
আপনার যদি ইতিমধ্যে প্রতিলিপি সেটআপ না করে থাকে তবে তথ্যের অখণ্ডতা নিশ্চিত করতে আপনাকে ডাম্প করতে টেবিলগুলি লক করতে হবে। সুতরাং এটি একটি ক্যাচ 22.
জর্দানস

9

এই লোকটির তুলনায় এটি প্রায় দেরি হয়ে গেছে যিনি বলেছিলেন যে তিনি মূল উত্তর হিসাবে দেরি করেছিলেন তবে আমার ক্ষেত্রে (উইন্ডোজ on-এর ডাব্লুএএমপি এর মাধ্যমে মাইএসকিউএল) আমাকে ব্যবহার করতে হয়েছিল:

--skip-lock-tables

"লক টেবিলগুলি ব্যবহার করার সময় ব্যবহারকারীর 'ডেবিয়ান-সিজ-রক্ষণাবেক্ষণ' @ 'লোকালহোস্ট' ডাটাবেস 'ইনফরমেশন_সেমিমা'র জন্য অ্যাক্সেস অস্বীকার করা হয়েছে"
রুই এফ রিবেইরো

6
    mysqldump -uuid -ppwd --skip-opt --single-transaction --max_allowed_packet=1G -q db |   mysql -u root --password=xxx -h localhost db

ভোট আপ করুন, এটি আমার জন্য কাজ করেছে - স্কিপ-অপট --সেলিং-লেনদেন
স্টিভেন

1
আমি এই উদ্দেশ্যে "--স্কিপ-অপ্ট" করার পরামর্শ দিচ্ছি না। এটি মূল প্রশ্নটি যা চেয়েছিল তার চেয়ে অনেক বেশি কাজ করে। এটি দ্রুত মোডটি বন্ধ করে দেয়, এতে
চরসেট

3

ডেটা এক্সপোর্টে মাইএসকিউএল ওয়ার্কবেঞ্চ ব্যবহার করার সময়, উন্নত বিকল্পগুলিতে ক্লিক করুন এবং "লক-সারণী" বিকল্পগুলি নির্বাচন করুন।

এখানে চিত্র বর্ণনা লিখুন


1

এই পদ্ধতির কোনওটিই আমার পক্ষে কাজ করেনি, তাই আমি কেবল এটি করেছি:

mysqldump [...] | grep -v "LOCK TABLE" | mysql [...]

এটি উভয় LOCK TABLE <x>এবং আদেশকে বাদ দেবে UNLOCK TABLES

দ্রষ্টব্য: আশা করি আপনার ডেটাতে এতে স্ট্রিং নেই!


2
- ডাম্প চলাকালীন
স্কিপ

1

Https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html#option_mysqldump_lock-tables এর কারণে :

কিছু বিকল্প, যেমন --opt (যা ডিফল্টরূপে সক্ষম হয়) স্বয়ংক্রিয়ভাবে সক্ষম - লক-টেবিলগুলি। আপনি যদি ওভাররাইড করতে চান তবে বিকল্প তালিকার শেষে --স্কিপ-লক-টেবিলগুলি ব্যবহার করুন।


0

আর একটি দেরি উত্তর:

আপনি যদি সার্ভার ডাটাবেসের একটি গরম অনুলিপি তৈরি করার চেষ্টা করছেন (একটি লিনাক্স পরিবেশে) এবং সমস্ত সারণীর ডাটাবেস ইঞ্জিনটি মাইআইএসএএম আপনার ব্যবহার করা উচিতmysqlhotcopy

ডকুমেন্টেশন অনুসারে:

এটি ডাটাবেস ব্যাকআপ তৈরি করতে ফ্লাশ ট্যাবলেট, লক ট্যাবলেট এবং সিপি বা স্কিপ ব্যবহার করে। এটি ডাটাবেস বা একক টেবিলগুলির ব্যাকআপ তৈরি করার একটি দ্রুত উপায় তবে এটি কেবল একই মেশিনে চালানো যেতে পারে যেখানে ডাটাবেস ডিরেক্টরিগুলি অবস্থিত। mysqlhotcopy কেবল মাইআইএসএএম এবং আর্কাইভ টেবিলগুলির ব্যাক আপ করার জন্য কাজ করে।

LOCK TABLESসময় সময় সার্ভার মাইএসকিউএল ফাইল কপি পারেন (এটি একটি ডাম্প দেখা যায় না) এর উপর নির্ভর করে।


0

আজও আমি একই সমস্যার মুখোমুখি হয়েছি কিন্তু কমান্ড লাইনটিতে আমার অ্যাক্সেস নেই o সুতরাং আমি নোটপ্যাড সম্পাদকটিতে এসকিএল ফাইলটি খুললাম এবং টেবিলগুলি থেকে লাইনটির নিচে সরিয়েছি

LOCK TABLES `yourtable name` WRITE;

তারপরে আমি আমার উন্নয়নের পরিবেশে আমদানি করেছি W আশা করি এটি কিছু সাহায্য করবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.