আমি কীভাবে মাইএসকিউএল এরকোড 13 এর বাইরে আউটফাইলে নির্বাচন করতে পারি?


114

আমি একটি টেবিলের বিষয়বস্তুগুলি একটি মাইএসকিউএল সেল্ট ইন আউটফিল স্টেটমেন্ট ব্যবহার করে সিএসভি ফাইলে ডাম্প করার চেষ্টা করছি। যদি আমি করি:

SELECT column1, column2
INTO OUTFILE 'outfile.csv'
FIELDS TERMINATED BY ','
FROM table_name;

এই ডিরেক্টরিতে এই ডাটাবেসের ফাইলগুলি সংরক্ষণ করা আছে একই ডিরেক্টরিতে সার্ভারে outfile.csv তৈরি করা হবে।

যাইহোক, আমি যখন আমার ক্যোয়ারী এতে পরিবর্তন করি:

SELECT column1, column2
INTO OUTFILE '/data/outfile.csv'
FIELDS TERMINATED BY ','
FROM table_name;

আমি পাই:

ERROR 1 (HY000): Can't create/write to file '/data/outfile.csv' (Errcode: 13)

এরকোড ১৩ একটি অনুমতি ত্রুটি, তবে আমি / ডেটার মালিকানা মাইএসকিএল: মাইএসকিএল এবং এটি change 777 অনুমতি দিলেও আমি তা পেয়ে যাই। মাইএসকিউএল ব্যবহারকারী "মাইএসকিএল" হিসাবে চলছে।

আশ্চর্যের সাথে আমি ফাইলটি / টিএমপি-তে তৈরি করতে পারি, আমি চেষ্টা করেছি এমন অন্য কোনও ডিরেক্টরিতে নয়, এমনকি এমন অনুমতি নির্ধারণের সাথেও যে মাইএসকিএল ডিরেক্টরিতে লিখতে সক্ষম হবে।

এটি মাইএসকিউএল 5.0.75 উবুন্টুতে চলছে।


3
13 টির মতো দেখতে সিস্টেম ত্রুটি, এটি সম্ভবত এটি নয় তবে একটি মাইএসকিউএল সেটিংস কেবলমাত্র একটি ডিরেক্টরিতে আউটফিলের মধ্যে সীমাবদ্ধ রয়েছে: dev.mysql.com/doc/refman/5.0/en/… সম্ভবত তাড়াতাড়ি নজর দেওয়া উচিত কিনা সেট করা /tmp
পেক্কা

সেই পরিবর্তনশীলটি আমার ইনস্টলেশনতে ফাঁকা, যা সেই দস্তাবেজ অনুসারে মানে আমার আউটপুট ডিরেক্টরিগুলি সীমাবদ্ধ করা উচিত নয়।
রায়ান ওলসন

উত্তর:


189

উবুন্টুর কোন বিশেষ সংস্করণ এটি এবং এটি উবুন্টু সার্ভার সংস্করণ?

অ্যাপোর্মার এবং মাইএসকিউএল এর প্রোফাইল সহ সাম্প্রতিক উবুন্টু সার্ভার সংস্করণগুলি (যেমন 10.04) জাহাজটি ডিফল্টরূপে মোড প্রয়োগ করতে পারে। আপনি এটির sudo aa-statusমতো নির্বাহ করে এটি পরীক্ষা করতে পারেন:

# sudo aa-status
5 profiles are loaded.
5 profiles are in enforce mode.
   /usr/lib/connman/scripts/dhclient-script
   /sbin/dhclient3
   /usr/sbin/tcpdump
   /usr/lib/NetworkManager/nm-dhcp-client.action
   /usr/sbin/mysqld
0 profiles are in complain mode.
1 processes have profiles defined.
1 processes are in enforce mode :
   /usr/sbin/mysqld (1089)
0 processes are in complain mode.

যদি মাইএসকিএলডিটি প্রয়োগের মোডে অন্তর্ভুক্ত করা হয়, তবে এটি সম্ভবত লেখাকে অস্বীকার করবে। /var/log/messagesঅ্যাপআর্মার যখন লেখাগুলি / অ্যাক্সেসগুলিকে ব্লক করে দেয় তখন এন্ট্রিগুলিতেও লিখিত হত । আপনি যা করতে পারেন তা হ'ল সম্পাদনা /etc/apparmor.d/usr.sbin.mysqldএবং যুক্ত /data/এবং /data/*নীচের কাছাকাছি:

...  
/usr/sbin/mysqld  {  
    ...  
    /var/log/mysql/ r,  
    /var/log/mysql/* rw,  
    /var/run/mysqld/mysqld.pid w,  
    /var/run/mysqld/mysqld.sock w,  
    **/data/ r,  
    /data/* rw,**  
}

এবং তারপরে AppArmor প্রোফাইলগুলি পুনরায় লোড করুন।

# sudo /etc/init.d/apparmor reload

সতর্কতা: উপরের পরিবর্তনটি মাইএসকিউএলকে / ডেটা ডিরেক্টরিতে পড়তে এবং লেখার অনুমতি দেবে। আমরা আশা করি আপনি ইতিমধ্যে এর সুরক্ষা সম্পর্কিত প্রভাবগুলি বিবেচনা করেছেন।


2
আমি এটি উল্লেখ করতে ঘৃণা করি, কিন্তু এমন একটি কারণ রয়েছে যা অ্যাপ আর্মার এটির অনুমতি দেয় না। মাইএসকিউএল এখন / ডেটা ফোল্ডারে যে কোনও কিছু সংশোধন এবং পড়ার ক্ষমতা রাখে। শুধু এখন হ্যাক করবেন না।
রায়ান ওয়ার্ড

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

1
মহান উত্তর !!! এটি আমার সমস্যার সমাধান করে, আমি অন্য কোনও ডিরেক্টরিতে লেখার চেষ্টাও করছিলাম। এখন, আমাকে গবেষণা করতে হবে এই সমস্ত কি ছিল! :) এটি সম্পর্কে শিখতে, আমি অন্যান্য ব্যক্তিকে অ্যাপমর্ম সম্পর্কে পড়ার পরামর্শ দিই (এবং সুতরাং, কমান্ডটি এএ-স্ট্যাটাস): en.wikedia.org/wiki/appArmor
ডেভিড এল

1
আমার ক্ষেত্রে এটি সাহায্য করেছে: /your/abs/folder/ r, /your/abs/folder/** rwk, }শেষে কমা অন্তর্ভুক্ত করতে ভুলবেন না!
এসিভি

1
এটি / টিএমপি লিখতে কাজ করে। পরিবর্তে উইন্ডোজ ব্যবহার করুন। লিনাক্স
চুষে দেয়

17

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

মাইএসকিউএলকে অ্যাক্সেস / ডেটা / অ্যাক্সেস করার অনুমতি দেওয়ার জন্য অ্যাপআর্মার পরিবর্তন করতে:

sudo gedit /etc/apparmor.d/usr.sbin.mysqld

ডিরেক্টরিগুলির তালিকার যে কোনও জায়গায় এই লাইনটি যুক্ত করুন:

/data/ rw,

তারপরে একটি করুন:

sudo /etc/init.d/apparmor restart

আরেকটি বিকল্প হ'ল পুরোপুরি মাইএসকিএলের জন্য অ্যাপআর্মার অক্ষম করা, এটি প্রস্তাবিত নয় :

sudo mv /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/

অ্যাপারমার পুনরায় চালু করতে ভুলবেন না:

sudo /etc/init.d/apparmor restart


: MySQL হল প্রকৃতপক্ষে নিষ্ক্রিয় apparmor আমি করতে প্রয়োজন cyberciti.biz/faq/ubuntu-linux-howto-disable-apparmor-commands
silver_mx

14

আমি জানি আপনি বলেছেন যে আপনি ইতিমধ্যে 7 to7 এ অনুমতি নির্ধারণের চেষ্টা করেছিলেন, তবে আমার কাছে প্রমাণ রয়েছে যে এটি আমার পক্ষে এটি একটি অনুমতির সমস্যা ছিল যা আমি পোস্টিং পোস্ট করছি যাতে এটি সাহায্য করতে পারে আশা করে run আমার অভিজ্ঞতা এখানে:

tmp $ pwd
/Users/username/tmp
tmp $ mkdir bkptest
tmp $ mysqldump -u root -T bkptest bkptest
mysqldump: Got error: 1: Can't create/write to file '/Users/username/tmp/bkptest/people.txt' (Errcode: 13) when executing 'SELECT INTO OUTFILE'
tmp $ chmod a+rwx bkptest/
tmp $ mysqldump -u root -T bkptest bkptest
tmp $ ls bkptest/
people.sql  people.txt
tmp $ 

me @ সার্ভার: / ডেটা $ পিডব্লিউডি / ডেটা আমাকে @ সার্ভার: / ডেটা $ এলএস -al মোট 60 ... drwxrwxrwx 2 mysql mysql 4096 2010-05-06 16:27 ডাম্পেস্ট আমাকে @ সার্ভার: / ডেটা $ mysqldump -u dbuser -পি -টি ডাম্পেস্ট -বি ডিবি_নাম - টেবিল পরীক্ষা পাসওয়ার্ড প্রবেশ করান: মাইএসকিल्डম্প: প্রাপ্তি ত্রুটি: 1: '/ডাটা /ডাম্পেস্টেস্ট / টেক্সট' টেক্সট তৈরি করতে / লিখতে পারছেন না (ইরকোড: 13) 'নির্বাচন করুন নির্বাচন করার সময়? আউটফাইল 'আমি @ সার্ভার: / ডেটা $ sudo chmod a + rwx ডাম্পেস্ট / আমার @ সার্ভার: / ডেটা $ mysqldump -u dbuser -p -T ডাম্পেস্ট -বি db_name - টেবিলের পাসওয়ার্ড প্রবেশ করান: mysqldump: ত্রুটি হয়েছে: 1: ( একই ত্রুটি)
রায়ান ওলসন

ও, ভাল, মন্তব্যগুলি বিন্যাস করবে না বুঝতে পারল না, তবে কয়েকটি ভিন্ন উপায়ে ডাবল চেক করেছে। প্রথমে mysql এর মালিকানাধীন টার্গেট ডিরেক্টরিটি দিয়ে: mysql, তারপরে আমি ব্যবহারকারীর মালিকানাধীন টার্গেট ডিরেক্টরিটি দিয়ে আমি ডাম্প কমান্ডটি চালাচ্ছিলাম, উভয় উপায়ে এখনও আমাকে একই অনুমতি ত্রুটি দেয়।
রায়ান ওলসন

রেকর্ডটির জন্য, এটি অ্যাপারমোর অনুমতিগুলি পরিবর্তিত করেও আমার পক্ষে কাজ করেছে
অ্যালেক্স

আমি অ্যাপমর্মে পরিবর্তন আনার চেষ্টা করেছি, এটি কার্যকর হয়নি। 'Chmod 777' অনুমোদনের পরিবর্তন আমার পক্ষে কাজ করেছে!
সুদর্শন_এমডি

7

মাইএসকিউএল এখানে বোকা হয়। এটি / tmp / ডেটা / .... এর আওতায় ফাইলগুলি তৈরি করার চেষ্টা করে তাই আপনি যা করতে পারেন তা নিম্নলিখিতটি:

mkdir /tmp/data
mount --bind /data /tmp/data

তারপরে আপনার প্রশ্নের চেষ্টা করুন try ইস্যুটি ডিবাগ করার কয়েক ঘন্টা পরে এটি আমার পক্ষে কাজ করেছে।


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

6

এই সমস্যাটি আমাকে দীর্ঘদিন ধরে বিরক্ত করছে। আমি লক্ষ্য করেছি যে এই আলোচনাটি আরএইচইএল / ফেকোরার সমাধানটিকে নির্দেশ করে না। আমি আরএইচইএল ব্যবহার করছি এবং আমি উবুন্টুতে অ্যাপএমারারের সাথে সম্পর্কিত কনফিগারেশন ফাইলগুলি খুঁজে পাই না, তবে আমি PATH ডিরেক্টরিতে প্রতিটি ডিরেক্টরি তৈরি করে MySQL দ্বারা অ্যাক্সেসযোগ্য করে আমার সমস্যার সমাধান করেছি। উদাহরণস্বরূপ, আপনি যদি একটি ডিরেক্টরি / টিএমপি তৈরি করেন, নিম্নলিখিত দুটি কমান্ডগুলি নির্বাচন করুন আউটফিলকে .sql এবং .sql ফাইল আউটপুট করতে সক্ষম করে তোলে

chown mysql:mysql /tmp
chmod a+rx /tmp

আপনি যদি আপনার হোম ডিরেক্টরি / হোম / টম ডিরেক্টরি তৈরি করেন, আপনার অবশ্যই এটি অবশ্যই / হোম এবং / হোম / টম উভয়ের জন্যই করতে হবে।


3
উদাহরণস্বরূপ / tmp ব্যবহার করা ভাল ধারণা নয় এবং আপনি / tmp ডিরেক্টরিটির (বেশিরভাগ ক্ষেত্রে) মালিকানা পরিবর্তন করতে চান না।
সাস্টারসেল

/ টিএমপি-র মালিকানা পরিবর্তন খারাপ, তবে / টিএমপি-র ভিতরে একটি অস্থায়ী ফোল্ডার তৈরি করা এবং chown mysql:mysqlআমার সমস্যার সমাধান করেছে
স্যামুয়েল প্রিভস্ট


4

চেষ্টা করার কিছু জিনিস:

  • হয় secure_file_privসিস্টেম ভেরিয়েবল সেট করতে চান? যদি তা হয় তবে সমস্ত ফাইল অবশ্যই সেই ডিরেক্টরিতে লেখা উচিত।
  • ফাইলটির অস্তিত্ব নেই তা নিশ্চিত করুন - মাইএসকিউএল কেবলমাত্র নতুন ফাইল তৈরি করবে, বিদ্যমান ফাইলগুলিকে ওভাররাইট করবে না।

1
আমি নিরাপদে_ ফাইল_প্রিয়ের জন্যও যাব। যদি ফাইলটি ইতিমধ্যে বিদ্যমান থাকে তবে ত্রুটি বার্তাটি আলাদা (এরকোড ১৩ নয়)।
জাভিয়ের মাইলার্ড

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

এছাড়াও, আমি পরীক্ষা করে দেখছি যে কোয়েরি চালানোর আগে ফাইলটির অস্তিত্ব নেই।
রায়ান ওলসন

সাহায্য করার জন্য ধন্যবাদ. আপনার অনুসন্ধানের ভিত্তিতে, আমি মনে করি না যে এই পরামর্শগুলির কোনওটিই আপনার সমস্যার কারণ হয়ে দাঁড়িয়েছে।
এমডিএমএ

3

আমার একই সমস্যা আছে এবং আমি নিম্নলিখিত পদক্ষেপগুলি দ্বারা এই সমস্যাটি সমাধান করেছি:

  • অপারেটিং সিস্টেম: উবুন্টু 12.04
  • বাতি ইনস্টল করা
  • মনে করুন আউটপুট ফাইল সংরক্ষণ করার জন্য আপনার ডিরেক্টরিটি হ'ল: / var / www / csv /

টার্মিনালে নিম্নলিখিত কমান্ড প্রয়োগ করুন এবং আউটপুট ফাইলে আপনার ডিরেক্টরি যুক্ত করতে gedit সম্পাদক ব্যবহার করে এই ফাইল সম্পাদনা করুন।

sudo gedit /etc/apparmor.d/usr.sbin.mysqld

  • এখন ফাইলটি সম্পাদকটিতে খোলা হবে দয়া করে সেখানে আপনার ডিরেক্টরি যুক্ত করুন

    / var / www / csv / * rw,

  • অনুরূপভাবে আমি আমার ফাইলে যুক্ত করেছি, নীচের প্রদত্ত চিত্র হিসাবে:

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

পরিষেবাগুলি পুনঃসূচনা করতে পরবর্তী কমান্ডটি কার্যকর করুন:

sudo /etc/init.d/apparmor পুনরায় আরম্ভ করুন

উদাহরণস্বরূপ আমি পিএসপি ফাইলে আউটপুট ডেটাতে পিএইচপিএমইডমিন ক্যোয়ারী বিল্ডারে নিম্নলিখিত কোয়েরি সম্পাদন করি

SELECT colName1, colName2,colName3
INTO OUTFILE '/var/www/csv/OUTFILE.csv'
FIELDS TERMINATED BY ','
FROM tableName;

এটি সফলভাবে সম্পন্ন হয়েছে এবং নির্বাচিত কলামগুলির সাথে সমস্ত সারি OUTPUT.csv ফাইলে লিখুন ...


2

আমার ক্ষেত্রে, সমাধানটি ছিল ডিরেক্টরি পাথের প্রতিটি ডিরেক্টরিকে পাঠযোগ্য এবং mysql( chmod a+rx) দ্বারা অ্যাক্সেসযোগ্য । ডিরেক্টরিটি এখনও কমান্ড লাইনে সম্পর্কিত পাথ দ্বারা নির্দিষ্ট করা হয়েছিল।

chmod a+rx /tmp
chmod a+rx /tmp/migration
etc.

2

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


1

আপনাকে একটি নিখুঁত পথ সরবরাহ করতে হবে, আপেক্ষিক পথ নয়।

আপনি যে ডেটা ডিরেক্টরিতে লেখার চেষ্টা করছেন তার পুরো পথ সরবরাহ করুন।


এটি আমার কাছে পরম পথের মতো দেখাচ্ছে। তা না হয়?
পেক্কা

2
আপনি মাইএসকিএল এর বাইরে ফাইলটি তৈরি করতে পারবেন তা যাচাই করতে এটি মাইএসকিএল ব্যবহারকারী হিসাবে চেষ্টা করুন:touch /data/outfile.csv
আইকে ওয়াকার

1
প্রথমে আমি এটি করতে পারিনি কারণ মাইএসকিএল ব্যবহারকারীর শেলটি / বিন / মিথ্যাতে সেট করা হয়েছিল, তাই আমি মাইএসকিএল হিসাবে লগইন করতে পারিনি। সমস্যাটি যে অবদান রাখছে না তা নিশ্চিত করার জন্য, আমি মাইএসকিএল এর শেলটি / বিন / ব্যাশে সেট করেছিলাম, সেই ব্যবহারকারীর কাছে sud করেছি এবং / ডেটাতে একটি ফাইল স্পর্শ করেছি। ফাইলটি সফলভাবে তৈরি করা হয়েছে, মাইএসকিএল-এর মালিকানাধীন।
রায়ান ওলসন 21

3
কোনও অ্যাকাউন্ট "অক্ষম" শেল ব্যবহার করা সত্ত্বেও আপনি কোনও অ্যাকাউন্টে মামলা করতে পারেন: su --shell=/bin/sh nameofaccount
মার্চ বি

ধন্যবাদ, আমি এটা সম্পর্কে অবগত ছিলাম না।
রায়ান ওলসন

1

উবুন্টু কি সেলিনাক্স ব্যবহার করে? এটি সক্ষম এবং প্রয়োগ করছে কিনা তা পরীক্ষা করে দেখুন। /var/log/audit/audit.log হেল্পুল হতে পারে (যদি সেখানে উবুন্টু এটি আটকে রাখে - তবে এটিই আরএইচএল / ফেডোরার অবস্থান)।


0

Cent.7 সেন্টোতে আমার একই সমস্যা ছিল আমার ক্ষেত্রে সমস্ত অনুমতি সেট করা ছিল এবং তবুও ত্রুটি ঘটেছে। সমস্যাটি ছিল যে এসই লিনাক্স "এনফোর্সিং" মোডে ছিল।

কমান্ডটি ব্যবহার করে আমি এটি "অনুমতিপ্রাপ্ত" তে স্যুইচ করেছি sudo setenforce 0

তারপরে আমার জন্য সবকিছু কাজ করে।

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