2012-10-22 31 views
7

हम एक अलग सर्वर के लिए वेब सर्वर पर किया जा रहा से हमारे डाटाबेस जा रहे हैं (अमेज़न आरडीएस पर)डेटा लोड स्थानीय INFILE विफल रहता है - (। एक आरडीएस उदाहरण के लिए एक अमेज़न EC2 वेबसर्वर से) php से, mysql के लिए

हमारे पास एक लोड डेटा इन्फाइल है जो इससे पहले काम करता है कि स्थानीय कीवर्ड की आवश्यकता होगी अब डेटाबेस वेबसर्वर को एक अलग मशीन पर होगा।

परीक्षण मेरी देव सर्वर पर, यह पता चला है कि यह काम नहीं करता:

  • मैं अभी भी php के रूप में मैं
  • मैं लोड कर सकते हैं डेटा स्थानीय mysql कमांडलाइन से INFILE किया गया है से डेटा लोड INFILE (--local_infile = 1)
  • मैं php से डेटा स्थानीय INFLE लोड नहीं कर सकता।

बीच उन 2 चीजें हैं जो काम करते हैं, यह पता नियम: वाक्य रचना और फाइल अनुमति सहित

  • mysql सर्वर एसक्यूएल या php कोड के साथ

    • समस्याओं अपलोड फ़ाइल के साथ
    • समस्याओं, सेटिंग्स की समस्या

    मुझे जो त्रुटि मिलती है वह है: ERROR 1148 (42000): प्रयुक्त कमांड को थाई के साथ अनुमति नहीं है एस MySQL संस्करण (मैं mysql कमांडलाइन से कि त्रुटि मिलती है अगर मैं का उपयोग नहीं करते --local_infile = 1)


    प्रासंगिक जानकारी के कुछ अन्य बिट्स:

    • Ubuntu 12.04, mysql 5.5.24, php 5.3.10
    • मैं php का उपयोग कर रहा हूँ mysql_connect (mysqli के बजाय, क्योंकि हम फेसबुक के हिप हॉप संकलक का उपयोग कर जो mysqli का समर्थन नहीं करता की योजना बना रहे।)
    • इस कारण से

      , कनेक्ट कमांड को एक अतिरिक्त ध्वज सेट की आवश्यकता है:

      mysql_connect($dbHost, $dbUser, $dbPass, false, 128); 
      
    • मैं phpinfo() का उपयोग किया है, इसकी पुष्टि करने mysql.allow_local_infile = On
    • मैं अमेज़न आरडीएस पर यह कोशिश की है (मामले में यह मेरी डेव सर्वर में कोई समस्या हुई थी) और यह वहाँ या तो काम नहीं करता। (Local_infile परम के चालू रहते।)

    केवल एक चीज के बारे में मैं पढ़ा है कि मैं प्रयास नहीं किया है ध्वज के साथ चालू स्थानीय infile अनुमति देने के लिए मेरी देव सर्वर पर mysql सर्वर संकलित करने के लिए है ... लेकिन अगर मैं अपने देव सर्वर पर काम कर रहा हूं तो यह मुझे अमेज़ॅन आरडीएस के साथ मदद करने वाला नहीं है। (जो इसके अलावा, डेटा लोड स्थानीय INFILE mysql कमांडलाइन से काम करता है।)


    ऐसा लगता है कि यह विशेष रूप php के mysql_connect()

    किसी का उपयोग कर डेटा लोड स्थानीय INFILE (शायद अमेज़न आरडीएस से साथ एक समस्या है की तरह) यह काम करने के लिए यह चाल जानने के लिए जानता है?

  • +0

    धन्यवाद, [http://php.net/releases/NEWS_5_4_0_beta1.txt ](http://php.net/releases/NEWS_5_4_0_beta1.txt) के अनुसार धन्यवाद जो कि PHP 5.3.9 में तय किया गया था और मैं उपयोग कर रहा हूं php 5.3.10-1ubuntu3.4 हालांकि मैं किसी और के पास कोई सुझाव नहीं है, तो मैं स्वयं परिवर्तनों के साथ PHP को संकलित करने का प्रयास कर सकता हूं। – Redzarf

    +0

    दरअसल, फिर से देखकर, वह बग पूरी तरह से पीडीओ से संबंधित है (जिसे आप उपयोग नहीं कर रहे हैं)। – eggyal

    +0

    किसी और के लिए जो इसे बाद में देख रहा है, @ggyal का उल्लेख किया गया बग https://bugs.php.net/bug.php?id=54158 – Redzarf

    उत्तर

    9

    मैंने इसे छोड़ दिया है, क्योंकि मुझे लगता है कि यह php में एक बग है - विशेष रूप से mysql_connect कोड, जिसे अब बहिष्कृत किया गया है।यह शायद बग रिपोर्ट में उल्लिखित चरणों के समान चरणों का उपयोग करके स्रोत में परिवर्तन के साथ स्वयं को संकलित करके हल किया जा सकता है कि @eggyal का उल्लेख किया गया है: https://bugs.php.net/bug.php?id=54158

    इसके बजाय, मैं एक सिस्टम() कर कर इसके आसपास काम करने जा रहा हूं कॉल करें और mysql कमांड लाइन का उपयोग करें:

    $sql = "LOAD DATA LOCAL INFILE '$csvPathAndFile' INTO TABLE $tableName FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\\\"' ESCAPED BY '\\\\\\\\' LINES TERMINATED BY '\\\\r\\\\n';"; 
    system("mysql -u $dbUser -h $dbHost --password=$dbPass --local_infile=1 -e \"$sql\" $dbName"); 
    

    यह मेरे लिए काम कर रहा है।

    +1

    इसके लायक होने के लिए, ऐसा लगता है कि यह वास्तव में एक PHP है 5.3.एक्स बग। मुझे एक ही समस्या दिखाई दे रही है, ऐसा लगता है कि पीडीओ माईएसQL चालक के लिए PHP स्रोत, बस और क्रूरता से पर्याप्त है, "local_infile = 1;" माना जाता है कि 5.4 रिलीज इसे ठीक करता है, हालांकि मैंने अभी तक अपने लिए यह सत्यापित नहीं किया है। –

    +0

    +1 'system' जाने का रास्ता है। – zengr

    +0

    @Redzarf क्यों उन लोगों को भी एस्केपिंग आवश्यक स्लैश कर रहे हैं? – codecowboy

    5

    जैसा कि this post में संदर्भित है, mysql_connect में तीसरा और चौथा पैरामीटर जोड़ने के लिए लोड स्थानीय डेटा INFILE काम करने की आवश्यकता है। यह मेरी मदद की। किसी भी अन्य सुझाव (my.cnf में एपर्मर, स्थानीय-infile = 1 व्यापक रूप से इंटरनेट पर चर्चा) मदद नहीं की। निम्नलिखित PHP कोड मेरे लिए काम किया!

    mysql_connect(HOST,USER,PASS,false,128); 
    

    यह सच है, इस manual में भी है।

    2

    निम्न पंक्ति है कि ग्राहक infile सच के साथ सक्रिय हो जाता है का उपयोग

    mysql --local-infile = 1 -u जड़ -p

    5

    यहाँ एक जांच सूची इस बुरा बग बाहर शासन करने के लिए दिया गया है:

    GRANT FILE ON *.* TO 'db_user'@'localhost'; 
    
    0123:

    1- अनुदान MySQL में उपयोगकर्ता फ़ाइल विशेषाधिकार, phpMyAdmin आम तौर पर इस विशेषाधिकार को कवर नहीं करता

    2/आदि/mysql/या अपने mysql रास्ते में my.cnf संपादित करें:

    [mysql] 
    local-infile=1 
    [mysqld] 
    local-infile=1 
    

    3- php.ini में पर/etc/PHP5/CLI/या इसी तरह की:

    mysql.allow_local_infile = On 
    

    वैकल्पिक रूप से आप अपनी स्क्रिप्ट में ini_set चला सकते हैं:

    ini_set('mysql.allow_local_infile', 1); 
    

    4- डेटाबेस हैंडलर पुस्तकालय सही विकल्प का उपयोग करना चाहिए।
    पीडीओ:

    new PDO('mysql:host='.$db_host.'.;dbname='.$db_name, $db_user, $db_pass, 
    array(PDO::MYSQL_ATTR_LOCAL_INFILE => 1)); 
    

    mysqli:

    $conn = mysqli_init(); 
    mysqli_options($conn, MYSQLI_OPT_LOCAL_INFILE, true); 
    mysqli_real_connect($conn,server,user,code,database); 
    

    5- सुनिश्चित करें कि INFILE आदेश फ़ाइल का निरपेक्ष पथ का उपयोग करता है और यह है कि यह मौजूद है:

    $sql = "LOAD DATA INFILE '".realpath(is_file($file))."'"; 
    

    6- जांचें कि लक्ष्य फ़ाइल और मूल निदेशक वाई PHP और MySQL द्वारा पठनीय हैं।

    $ sudo chmod 777 file.csv 
    

    7- आप स्थानीय रूप से काम कर रहे हैं आप अपने एसक्यूएल से LOCAL निकाल सकते हैं:

    LOAD DATA INFILE 
    

    बजाय:

    LOAD DATA LOCAL INFILE 
    

    नोट: पुनः आरंभ करने के लिए याद रखें MySQL और PHP सेवाएं यदि आप उनकी कॉन्फ़िगरेशन फ़ाइलों को संपादित करते हैं।

    उम्मीद है कि यह किसी की सहायता करेगा।

     संबंधित मुद्दे

    • कोई संबंधित समस्या नहीं^_^