কমান্ড লাইন থেকে একটি প্লেটেক্সট (সিএসভি) ব্যাকআপে একটি মাইএসকিএল ডাটাবেস ডাম্প করুন


93

আমি মাইএসকিএলডাম এড়াতে চাই যেহেতু সেই ফর্মের ফলাফলগুলি কেবল মাইএসকিএল পড়ার পক্ষে সুবিধাজনক। সিএসভি আরও সার্বজনীন বলে মনে হচ্ছে (প্রতি টেবিলের জন্য একটি ফাইল ভাল)। তবে যদি মাইএসকিলডাম্পের সুবিধাগুলি থাকে তবে আমি সব কান। এছাড়াও, আমি কমান্ড লাইন (লিনাক্স) থেকে চালাতে পারি এমন কিছু চাই। যদি এটি কোনও মাইএসকিএল স্ক্রিপ্ট হয় তবে কীভাবে এই জাতীয় জিনিস তৈরি করা যায় তা নির্দেশকারী helpful


উত্তর:


142

আপনি যদি একসাথে টেবিলের সাথে লড়াই করতে পারেন এবং আপনার ডেটা বাইনারি না -Bহয় তবে mysqlকমান্ডের বিকল্পটি ব্যবহার করুন । এই বিকল্পের সাহায্যে এটি টিএসভি (ট্যাব বিচ্ছিন্ন) ফাইল উত্পন্ন করবে যা এক্সেল ইত্যাদিতে খুব সহজেই আমদানি করতে পারে:

% echo 'SELECT * FROM table' | mysql -B -uxxx -pyyy database

বিকল্পভাবে, আপনি যদি সার্ভারের ফাইল সিস্টেমে সরাসরি অ্যাক্সেস পেয়ে থাকেন তবে ব্যবহার করুন SELECT INTO OUTFILEযা আসল সিএসভি ফাইল তৈরি করতে পারে:

SELECT * INTO OUTFILE 'table.csv'
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
FROM table

ধন্যবাদ! আপনার দ্বিতীয় "টেবিল" "ডাটাবেস" হওয়া উচিত, তাই না? আপনি জানেন যে টিএসভি এর পরিবর্তে সিএসভির জন্য কোনও বিকল্প নেই?
21'09

দুহ - হ্যাঁ, এটি 'ডাটাবেস' পড়া উচিত ছিল। না, সিএসভির জন্য কোনও বিকল্প নেই, এটি মাইএসকিউএল'এর অন্তর্নির্মিত 'সিলেক্ট ইন আউটফিল' না ব্যবহার করা সম্পর্কে আমি সবচেয়ে ভাল, যা সিএসভি করতে পারে, তবে ক্লায়েন্ট নয়, সার্ভারে ফাইলগুলি লিখে দেয়।
Alnitak

আউটপুট ফাইলটিতে ওভাররাইট কীভাবে বাধ্য করা যায়?
জে.সি.এম

11
মনে রাখবেন যে কোনও আপেক্ষিক পাথ (বা কেবল কোনও ফাইলের নাম) দেওয়া হলে ফাইলটি আপনার এমওয়াইএসকিউএল ডিরেক্টরিতে উপস্থিত হবে, এবং আপনার বর্তমান শেল ডিরেক্টরিতে নয় (যেমনটি কোথা \. file.sqlথেকে পড়ে)। যেমন, আপনার ইনস্টলের উপর নির্ভর করে আপনি সম্ভবত এটি খুঁজে পাবেন/var/lib/mysql/[db_name]/table.csv
মালা

32

মাইএসকিউএল নিজেই, আপনি সিএসভি আউটপুট যেমন উল্লেখ করতে পারেন:

SELECT order_id,product_name,qty
FROM orders
INTO OUTFILE '/tmp/orders.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'

Http://www.tech-recips.com/rx/1475/save-mysql-query-results-into-a-text-or-csv-file/ থেকে


4
আমি যে ডিরেক্টরিটি উল্লেখ করেছি তার মধ্যে ডাম্প করা ফাইলটি খুঁজে পাচ্ছি না, কেন?
জে.সি.এম

@ জিসিএম এটি সার্ভারে ডাম্প করে
Alnitak

26

আপনি mysqldump's --tabবিকল্প সহ এক সাথে পুরো ডেটাবেস ডাম্প করতে পারেন । আপনি একটি ডিরেক্টরির পাথ সরাবরাহ এবং এক সৃষ্টি .sqlসাহায্যে ফাইল CREATE TABLE DROP IF EXISTSসিনট্যাক্স এবং .txtবিষয়বস্তু সঙ্গে ফাইল, ট্যাব পৃথক করা হয়। কমা দ্বারা পৃথক করা ফাইলগুলি তৈরি করতে আপনি নিম্নলিখিতগুলি ব্যবহার করতে পারেন:

mysqldump --password  --fields-optionally-enclosed-by='"' --fields-terminated-by=',' --tab /tmp/path_to_dump/ database_name

এই পাথটি মাইএসকিএল ব্যবহারকারী এবং কমান্ডটি চালিত ব্যবহারকারী উভয়ের দ্বারা রচনীয় হওয়া দরকার, তাই সরলতার জন্য আমি chmod 777 /tmp/path_to_dump/প্রথমে সুপারিশ করি ।


4
আমি এই উত্তরে ফিরে আসতে থাকি, একটি সীমাবদ্ধ ফাইলে সমস্ত টেবিল রফতানি করার এটি অবশ্যই সেরা উপায়।
জোভ্যালেন্ডার 6:51

mysqldump: You must use option --tab with --fields-...
মার্কো মার্শালা

মূল হিসাবে: GRANT FILE ON *.* TO 'user1'@'localhost';- স্ট্যাকওভারফ্লো . com / a / 15014385 / 1707015 । আমার ক্ষেত্রে আমাকে /var/lib/mysql-files/(পরিবর্তে /tmp/) নিতে হবে, ব্যবহারকারীকে মাইএসকিএল: মাইএসকিএল সেট করতে হবে এবং 777 - stackoverflow.com/a/32737616/1707015 এ অধিকার নির্ধারণ করতে হয়েছিল ।
qräbnö

18

সিলেক্ট ইন আউটফাইল বিকল্পটি আমার পক্ষে কাজ করবে না তবে এসইডি এর মাধ্যমে ট্যাব-বিস্মৃত ফাইলের পাইপিংয়ের নীচের রাউন্ডআউট উপায়:

mysql -uusername -ppassword -e "SELECT * from tablename" dbname | sed 's/\t/","/g;s/^/"/;s/$/"/' > /path/to/file/filename.csv

4
এই কমান্ডের ফলে আউটপুট ফাইলে চিঠিটি tপ্রতিস্থাপন করা ", "হয়েছিল। আমি ঠিক কি পরে ছিল না।
ব্রেনানআর

9

এটির জন্য সহজ আদেশ এখানে command

mysql -h<hostname> -u<username> -p<password> -e 'select * from databaseName.tableNaame' | sed  's/\t/,/g' > output.csv

কলাম মানটিতে যদি কমা থাকে তবে আমরা নিম্নলিখিত কমান্ড দিয়ে .csv এর পরিবর্তে .tsv উত্পন্ন করতে পারি

mysql -h<hostname> -u<username> -p<password> -e 'select * from databaseName.tableNaame' > output.csv

সিএসভির জন্য: এটি যেখানে কাজ করে যেখানে আমার কেবল কমা দরকার works mysql -hlocalhost -uroot -e 'select * from databaseName.tableNaame' | sed 's/\t/,/g' > /tmp/output.csv`

3

আপনার যদি সত্যিই "ব্যাকআপ" দরকার হয় তবে আপনার টেবিল সংজ্ঞা, দেখুন সংজ্ঞা, স্টোর পদ্ধতি এবং এর মতো ডাটাবেস স্কিমাও প্রয়োজন। একটি ডাটাবেসের ব্যাকআপ কেবল ডেটা নয়।

ব্যাকআপের জন্য মাইএসকিএলডাম্প বিন্যাসের মানটি নির্দিষ্টভাবে এটি মাইএসকিএল ডেটাবেসগুলি পুনরুদ্ধার করতে এটি ব্যবহার করা খুব সহজ। সহজেই পুনরুদ্ধার করা হয়নি এমন একটি ব্যাকআপ অনেক কম কার্যকর। আপনি যদি মাইএসকিএল ডেটা নির্ভরযোগ্যভাবে ব্যাকআপ করার জন্য কোনও পদ্ধতির সন্ধান করে থাকেন তবে আপনি কোনও মাইএসকিএল সার্ভারে পুনরুদ্ধার করতে পারেন তবে আমার মনে হয় আপনার মাইএসকিএলডাম সরঞ্জামটি থাকা উচিত।

মাইকিউএল বিনামূল্যে এবং অনেকগুলি বিভিন্ন প্ল্যাটফর্মগুলিতে চালিত হয়। একটি নতুন মাইএসকিএল সার্ভার স্থাপন করা যা আমি পুনরুদ্ধার করতে পারি। আমি মাইএসকিএল সেটআপ না করতে পেরে মোটেই চিন্তিত নই যাতে আমি পুনরুদ্ধার করতে পারি।

সিএসভি / টিএসভি ব্যর্থতার মতো ভঙ্গুর বিন্যাসের ভিত্তিতে কাস্টম ব্যাকআপ / পুনরুদ্ধার সম্পর্কে আমি আরও বেশি চিন্তিত হব। আপনি কি নিশ্চিত যে আপনার ডেটাতে থাকা সমস্ত উদ্ধৃতি, কমা বা ট্যাবগুলি সঠিকভাবে পালিয়ে যাবে এবং তারপরে আপনার পুনরুদ্ধার সরঞ্জামটি দ্বারা সঠিকভাবে পার্স করা যাবে?

আপনি যদি ডেটা উত্তোলনের জন্য কোনও পদ্ধতি সন্ধান করছেন তবে অন্যান্য উত্তরে বেশ কয়েকটি দেখুন।


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

দেশীয় পদ্ধতি ব্যবহার করে ব্যাকআপ উভয়ই রাখার ক্ষেত্রে আমি প্রচুর মূল্য দেখতে পাচ্ছি এবং অন্যান্য উদ্দেশ্যেও নিষ্কাশন করতে পারি।
জোরডাচে

এমকে-প্যারালাল-রিস্টোর এমকে-প্যারালাল ডাম্পের সাহায্যে তৈরি করা একটি সিএসভি ব্যাকআপ পুনরুদ্ধার করতে পারে, যাতে আপনি উভয় বিশ্বের সেরা পেতে পারেন। আসলে, এমকে-প্যারালালাল-রিস্টোরটি আপনার নির্ধারিত যে কোনও ট্রিগার শেষের দিকে পুনরুদ্ধার করা হয়েছে তা নিশ্চিত করে আরও ভাল কাজ করে।
পল ডিকসন

3

CSV ফাইলগুলিতে আউটপুট পেতে আপনি নীচের স্ক্রিপ্টটি ব্যবহার করতে পারেন। শিরোনাম সহ টেবিলের জন্য একটি ফাইল।

for tn in `mysql --batch --skip-page --skip-column-name --raw -uuser -ppassword -e"show tables from mydb"`
do 
mysql -uuser -ppassword mydb -B -e "select * from \`$tn\`;" | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > $tn.csv
done

ব্যবহারকারী আপনার ব্যবহারকারীর নাম, পাসওয়ার্ড হ'ল পাসওয়ার্ড যদি আপনি প্রতিটি টেবিলের জন্য পাসওয়ার্ড টাইপ করতে না চান এবং মাইডিবি ডাটাবেসের নাম database

স্ক্রিপ্টের ব্যাখ্যা: সিডে প্রথম এক্সপ্রেশনটি "," দিয়ে ট্যাবগুলিকে প্রতিস্থাপন করবে যাতে আপনার ক্ষেত্রগুলি ডাবল উদ্ধৃতিতে আবদ্ধ থাকে এবং কমা দ্বারা পৃথক হয়। দ্বিতীয়টি শুরুতে ডাবল উদ্ধৃতি সন্নিবেশ করান এবং তৃতীয়টি শেষে ডাবল উদ্ধৃতি সন্নিবেশ করান। এবং চূড়ান্তটি of n কে দেখায়।


এটি বেশিরভাগ ক্ষেত্রে আমাকে যেখানে যেতে হবে সেখানে পেয়েছিলেন তবে "টি" অক্ষরটি কমা দিয়ে প্রতিস্থাপন করা হচ্ছিল তখন অবাক হয়েছিল: stackoverflow.com/a/2610121/8400969
মাইকেল

এবং এটি --skip-column-namesমাইএসকিএল-এর আমার সংস্করণেও বলা উচিত
মাইকেল

2

এমকে-প্যারালাল-ডাম্প যা চিরকালের জন্য দরকারী ম্যাটকিট স্যুটগুলির সরঞ্জামগুলির অংশ এটি পরীক্ষা করে দেখুন । এটি --csv বিকল্পের সাহায্যে কমা-বিচ্ছিন্ন ফাইলগুলি ডাম্প করতে পারে।

এটি পৃথক সারণী নির্দিষ্ট না করেই আপনার পুরো ডিবি করতে পারে এবং আপনি ব্যাকআপ সেট টেবিলের টেবিলগুলির গোষ্ঠী নির্দিষ্ট করতে পারেন।

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


এটি আদর্শ ব্যাকআপ নাও হতে পারে তবে ভাগ করে নেওয়ার জন্য পুরোপুরি দুর্দান্ত। ধন্যবাদ!
atroon

maatkitpercona toolkitএখনকার অংশ বলে মনে হচ্ছে তবে আমি সংশ্লিষ্ট সরঞ্জামগুলি খুঁজে পাচ্ছি না।
sjas

1

দুই লাইনের পাওয়ারশেলের উত্তর:

# Store in variable
$Global:csv = (mysql -uroot -p -hlocalhost -Ddatabase_name -B -e "SELECT * FROM some_table") `
| ConvertFrom-Csv -Delimiter "`t"

# Out to csv
$Global:csv | Export-Csv "C:\temp\file.csv" -NoTypeInformation

বুম-বাটা-বুম

-D = আপনার ডাটাবেসের নাম

-e = ক্যোয়ারী

-B = ট্যাব-সীমাবদ্ধ


1

আপনি সিএসভি হিসাবে পুরো ডিবি ডাম্প করতে চান

#!/bin/bash

host=hostname
uname=username
pass=password

port=portnr
db=db_name
s3_url=s3://bxb2-anl-analyzed-pue2/bxb_ump/db_dump/



DATE=`date +%Y%m%d`
rm -rf $DATE

echo 'show tables' | mysql -B -h${host} -u${uname} -p${pass} -P${port} ${db} > tables.txt
awk 'NR>1' tables.txt > tables_new.txt

while IFS= read -r line
do
  mkdir -p $DATE/$line
  echo "select * from $line" | mysql -B -h"${host}" -u"${uname}" -p"${pass}" -P"${port}" "${db}" > $DATE/$line/dump.tsv
done < tables_new.txt

touch $DATE/$DATE.fin


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