মাইএসকিউএল লোড ডেটা infile জন্য অ্যাক্সেস প্রত্যাখ্যান


105

আমি পিএইচপি-তে সমস্ত সময় মাইএসকিউএল কোয়েরি ব্যবহার করি, কিন্তু যখন আমি চেষ্টা করি

LOAD DATA INFILE

আমি নিম্নলিখিত ত্রুটি পেয়েছি

# 1045 - ব্যবহারকারীর 'ব্যবহারকারী' @ 'লোকালহোস্ট' এর জন্য অ্যাক্সেস অস্বীকার করা হয়েছে (পাসওয়ার্ড ব্যবহার করে: হ্যাঁ)

কেউ এর অর্থ কী জানেন?

উত্তর:


197

আমি ঠিক এই সমস্যাটি মধ্যে দৌড়ে। আমাকে LOCALআমার এসকিউএল স্টেটমেন্টে যুক্ত করতে হয়েছিল।

উদাহরণস্বরূপ, এটি অনুমতি সমস্যা দেয়:

LOAD DATA INFILE '{$file}' INTO TABLE {$table}

যোগ LOCALআপনার বিবৃতি ও অনুমতি ইস্যু দূরে যেতে হবে। তাই ভালো:

LOAD DATA LOCAL INFILE '{$file}' INTO TABLE {$table}

12
এটি একটি ভিন্ন জিনিস করে। এটি অস্থায়ী ডিরেক্টরিতে আপনার ফাইলটি সার্ভারে আপলোড করে। এটি কখনও কখনও প্রয়োজনীয় হয়, তবে যদি infil ইতিমধ্যে মাইএসকিউএল সার্ভারে থাকে তবে আপনি কেবল অপ্রয়োজনীয় কাজ করছেন।
jeffcook2150

1
হ্যাঁ, এটি আমার জন্য কৌশলটি করেছে, আমি ডেটাবেস সার্ভার পোর্টকে এসএসএসের উপর দিয়ে যাচ্ছিলাম এবং আমি অনুমান করি যে এটি স্থানীয় অংশ ছাড়াই দূরবর্তী ডাটাবেস সার্ভারে ফাইলটি খুঁজছিল
মাইকে

2
@ জেরেমিসওয়াইসিটি আমার জন্য এটি নিম্নলিখিত ত্রুটিটি উত্পন্ন করে: ত্রুটি কোড: 1148 ব্যবহৃত এই কমান্ডটি এই মাইএসকিউএল সংস্করণ সহ অনুমোদিত নয়। আমি এই সমস্যার জন্য কিছু উত্তর চেষ্টা করেছিলাম যেমন মাইএসকিএল ফাইলটি স্থানীয়-ইনফিলিটি = 1 তে পরিবর্তন করেছিলাম এবং সেটিও ব্যর্থ হয়েছিল।
অরওয়েলহিনডেনবার্গ

মাইএসকিউএল-এর একটি আপডেট 6.2.5 এ আমার জন্য এই সমস্যার সমাধান করেছে
অরওয়েলহিনডেনবার্গ

4
--local-infileঅপশনটির সাথে আপনাকে মাইএসকিএল কল করতেও পারে ।
shabbychef

32

আমার এই সমস্যা ছিল আমি আশেপাশে অনুসন্ধান করেছি এবং সন্তোষজনক উত্তর পাই না। আমি আমার অনুসন্ধানের ফলাফলগুলির নীচে সংক্ষেপে বলছি।

অ্যাক্সেস অস্বীকার ত্রুটির অর্থ এই হতে পারে:

  • 'ব্যবহারকারীর' @ 'লোকালহোস্ট'-এ ফাইলের অধিকার নেই ( GRANT FILE on *.* to user@'localhost'); বা,
  • আপনি যে ফাইলটি লোড করার চেষ্টা করছেন সেটি মাইএসকিএল সার্ভার চলমান মেশিনে বিদ্যমান নেই (যদি লোড ডেটা ইনফাইল ব্যবহার করা হয়); বা,
  • আপনি যে ফাইলটি লোড করার চেষ্টা করছেন সেটি আপনার স্থানীয় মেশিনে বিদ্যমান নেই (যদি লোড ডেটা স্থানীয় তথ্য ব্যবহার করা হয়); বা,
  • আপনি যে ফাইলটি লোড করার চেষ্টা করছেন সেটি বিশ্ব পঠনযোগ্য নয় (আপনার ফাইল এবং সমস্ত প্যারেন্ট ডিরেক্টরিগুলি বিশ্ব-পঠনযোগ্য হতে হবে: chmod 755 ডিরেক্টরি; এবং chmod 744 file.dat)

+1: এটি আমার পক্ষে কাজ করেছে: আপনি যে ফাইলটি লোড করার চেষ্টা করছেন সেটি বিশ্ব পাঠযোগ্য নয় (আপনার ফাইল এবং সমস্ত পিতামত ডিরেক্টরি বিশ্ব-পঠনযোগ্য হতে হবে: chmod 755 ডিরেক্টরি; এবং, chmod 744 file.dat) । আমি আমার সমস্ত ডিরেক্টরিতে অনুমতিগুলি পরিবর্তন করি নি
gavdotnet

1
ব্যবহারকারী তাতিয়ানা নির্দেশ করে যে আপনি কেবলমাত্র পুরো সার্ভারের জন্য ডাটাবেস প্রতি ফাইল ফাইলে অধিকার দিতে পারবেন না। অনুদান কমান্ড "এ GRANT ফাইল হবে ব্যবহারকারীকে @ 'স্থানীয় হোস্ট' দ্বারা 'পাসওয়ার্ড') চিহ্নিত;"
জাল

3
@ জাল আমি মনে করি আপনার অর্থ "গ্রান্ট ফাইল অন * * * * ব্যবহারকারীর কাছে ..." - সম্ভবত নক্ষত্রের অক্ষরগুলি ছিনিয়ে নেওয়া হয়েছিল
ইউজিন এম

হিসাবে @ ইউজিন এম বলেছেন যে এটি ত্রুটি দেয় ডিবি গ্রান্ট এবং গ্লোবাল
অ্যাকাউন্টেন্ট

19

এই আদেশটি ব্যবহার করে দেখুন:

load data local infile 'home/data.txt' into table customer;

এই কাজ করা উচিত. এটা আমার ক্ষেত্রে কাজ করেছে।


3
ERROR 1148 (42000): The used command is not allowed with this MySQL version
স্টিয়ার্ট

@ স্টেটওয়ার্ট, উপরের কমান্ড থেকে 'লোকাল' সরান। পরবর্তীকালে মাইএসকিএল সংস্করণগুলি এই পতাকাটিকে সমর্থন করবে বলে মনে হয় না যখন গ্লোবাল ভেরিয়েবল 'লোকাল_ইনফায়াল' ভেরিয়েবলটি 'চালু' (নীচে হিসাবে) সেট করা থাকে। আদেশ তাই হবে; mysql> লোড ডেটা টেবিল গ্রাহকের জন্য 'হোম / ডেটা.টিএসটিএস্ট' ছড়িয়ে দেয়; + --------------- + ------- + | পরিবর্তনশীল_নাম | মান | + --------------- + ------- + | লোকাল_ইনফাইল | অন ​​| + --------------- + ------- +
কামরান হায়দার

@ কামরানহাইডার শোনায় আপনার মতামত আমার কাছে ভাল উত্তর পেয়েছে। কেন এটি পুরো উত্তর হিসাবে যুক্ত করবেন না?
স্টুয়ার্ট

10

আপনার মাইএসকিউএল ব্যবহারকারীকে ফাইলের অধিকার মঞ্জুর হয়েছে তা নিশ্চিত করুন।

আপনি যদি ভাগ করা ওয়েব হোস্টিংয়ে থাকেন তবে আপনার হোস্টিং সরবরাহকারী দ্বারা এটি অবরুদ্ধ করার সুযোগ রয়েছে।


একটি শেয়ার্ড ওয়েব হোস্টিংয়ে: "লোড ডেটা লোকাল ইনফিল" ব্যবহার করা কি সহায়ক হবে?
পিটার 18

3

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

    File tempFile = File.createTempFile(tableName, ".csv");
    FileUtils.copyInputStreamToFile(data, tempFile);

    JdbcTemplate template = new JdbcTemplate(dataSource);
    String path = tempFile.getAbsolutePath().replace('\\', '/');
    int rows = template.update(MessageFormat
            .format("LOAD DATA LOCAL INFILE ''{0}'' INTO TABLE {1} FIELDS TERMINATED BY '',''",
                    path, tableName));
    logger.info("imported {} rows into {}", rows, tableName);

    tempFile.delete();

2

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

  • সক্রিয় করুন লোড ইনফিল চলক
  • আমার কাস্টম মাইএসকিএল ব্যবহারকারীকে গ্র্যান্ড ফাইল অনুমতি permission
  • Safe_file_priv ভেরিয়েবলটি নিষ্ক্রিয় করুন (আমার ফাইলটি ওয়েবসারভার দ্বারা / tmp ফোল্ডারে আপলোড করা হয়েছিল যা অবশ্যই myslq / var / lib / mysql- ফাইলের সুরক্ষিত ডিরেক্টরি নয়)

এই তৃতীয় পয়েন্টের জন্য, আপনি এখানে উল্লেখ করতে পারেন: https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_secure_file_priv

বিআর,

বিজ্ঞাপন


2

আমার সাথেও এটি ঘটেছিল এবং ইয়ামির তার পোস্টে বর্ণিত সমস্ত পদক্ষেপ অনুসরণ করেও আমি এটি কার্যকর করতে পারিনি।

ফাইলটি /tmp/test.csv এ ছিল 777 অনুমতি নিয়ে। মাইএসকিউএল ব্যবহারকারীর কাছে ফাইল অনুমতি ছিল, লোকাল বিকল্পটি আমার মাইএসকিউএল সংস্করণ দ্বারা অনুমোদিত ছিল না, তাই আমি আটকে গিয়েছিলাম।

শেষ পর্যন্ত আমি চালিয়ে সমস্যার সমাধান করতে সক্ষম হয়েছি:

sudo chown mysql:mysql /tmp/test.csv

2

আপনি যদি কমান্ড লাইন ব্যবহার করেন তবে আমি একটি সহজ পেয়েছি

হিসাবে লগইন করুনmysql -u[username] -p[password] --local-infile

তারপর SET GLOBAL local_infile = 1;

দ্বারা আপনার ডাটাবেস নির্বাচন করুন use [db_name]

এবং পরিশেষে LOAD DATA LOCAL INFILE 'C:\\Users\\shant\\Downloads\\data-1573708892247.csv' INTO TABLE visitors_final_test FIELDS TERMINATED BY ','LINES TERMINATED BY '\r \n' IGNORE 1 LINES;


--Local-inline যোগ করা আমাকে সহায়তা করেছিল। যাইহোক, স্থানীয়_ফেলা বৈশ্বিক পরিবর্তনশীল আমার ক্ষেত্রে ইতিমধ্যে চালু হয়েছে। আমি মনে করি ব্যবহারকারীদের পরিবর্তন করার আগে তারা এই ভেরিয়েবেলে কী মান লিখেছিল তা আগে নির্ধারণ করা ভাল।
ইউজিন মায়সাইক

আরডিএস ব্যবহারকারীদের জন্য => - লোকাল-ইনফিল যোগ করা আরডিএসে আমাকে সহায়তা করেছিল, তবে আরডিএসে SET GLOBAL local_infile = 1;কাজ করবে বলে মনে হয় না, তবে যাই হোক না কেন --local-infileকৌশলটি করেছে
ফ্যাক্ট

0

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

1) সমস্ত কলামের সাথে টেবিল তৈরি করুন VARCHAR (n) নূন্য উদাহরণ:

mysql> CREATE TABLE cw_well2( api VARCHAR(10) NULL,api_county VARCHAR(3) NULL);


 2) সিএসভি থেকে শিরোনাম (প্রথম লাইন) সরিয়ে ফেলুন, তারপরে লোড করুন (আপনি যদি স্থানীয়কে ভুলে যান তবে আপনি পাবেন "# 1045 - ব্যবহারকারীর 'ব্যবহারকারী' @ 'লোকালহোস্ট' (পাসওয়ার্ড ব্যবহার করে: YES)") এর জন্য অ্যাক্সেস প্রত্যাখ্যান করা হয়েছে):

mysql> LOAD DATA LOCAL INFILE "/home/magula6/cogswatch2/well2.csv" INTO TABLE cw_well2 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'     -> ; Query OK, 119426 rows affected, 19962 warnings  (3.41 sec)


 3) কলাম পরিবর্তন করুন:

mysql> ALTER TABLE cw_well2 CHANGE spud_date spud_date DATE;

mysql> ALTER TABLE cw_well2 CHANGE latitude latitude FLOAT;

ভাল খবর!


-5

সম্ভবত এটির অর্থ হ'ল আপনি যে পাসওয়ার্ড সরবরাহ করেছিলেন 'user'@'localhost'তা ভুল।


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