سؤال

MySQL رائع! أنا متورط حاليًا في عملية ترحيل خادم رئيسية ، وكانت قاعدة البيانات الصغيرة الخاصة بنا تستضيفها على نفس الخادم مثل العميل.
لذلك اعتدنا أن نفعل هذا: SELECT * INTO OUTFILE .... LOAD DATA INFILE ....

الآن ، نقلنا قاعدة البيانات إلى خادم مختلف و SELECT * INTO OUTFILE .... لم يعد يعمل ، مفهومة - أسباب أمنية أعتقد. ولكن ، من المثير للاهتمام LOAD DATA INFILE .... يمكن تغييره إلى LOAD DATA LOCAL INFILE .... و BAM ، يعمل.

أنا لا أشكو ولا أعرب عن الاشمئزاز تجاه MySQL. البديل لتلك الخطين المضافة من الكود الإضافي ونموذج استدعاء النظام A .SQL Script. كل ما أردت معرفته هو السبب LOAD DATA LOCAL INFILE يعمل ولماذا لا يوجد شيء من هذا القبيل SELECT INTO OUTFILE LOCAL?

لقد قمت بواجبي ، ولم أتمكن من العثور على إجابة مباشرة على أسئلتي أعلاه. لم أتمكن من العثور على طلب ميزة @ mySQL أيضًا. إذا كان بإمكان شخص ما مسح ذلك ، فقد يكون ذلك رائعًا!

هل ماريادب قادر على التعامل مع هذه المشكلة؟

هل كانت مفيدة؟

المحلول

من الدليل: The SELECT ... INTO OUTFILE يُقصد بالبيان في المقام الأول للسماح لك بتفريغ جدول بسرعة إلى ملف نصي على جهاز الخادم. إذا كنت ترغب في إنشاء الملف الناتج على مضيف عميل بخلاف مضيف الخادم ، فلا يمكنك استخدامه SELECT ... INTO OUTFILE. في هذه الحالة ، يجب عليك بدلاً من ذلك استخدام أمر مثل mysql -e "SELECT ..." > file_name لإنشاء الملف على مضيف العميل. "

http://dev.mysql.com/doc/refman/5.0/en/select.html

مثال:

mysql -h my.db.com -u usrname--password=pass db_name -e 'SELECT foo FROM bar' > /tmp/myfile.txt

نصائح أخرى

يمكنك تحقيق ما تريده مع وحدة التحكم MySQL مع خيار -S (-Silent) الذي تم تمريره.

من المحتمل أن تكون فكرة جيدة أيضًا في خيار -R (-RAW) بحيث لا يتم هروب الشخصيات الخاصة. يمكنك استخدام هذا لاستفسارات الأنابيب كما تريد.

mysql -u username -h hostname -p -s -r -e "Select Concat ('' '،' '،' Works ')"

تحرير: أيضًا ، إذا كنت ترغب في إزالة اسم العمود من إخراجك ، فما عليك سوى إضافة -S آخر (MySQL -SS -R إلخ)

المسار الذي تعطيه LOAD DATA INFILE هو لنظام الملفات على الجهاز الذي يعمل فيه الخادم ، وليس الجهاز الذي تتصل منه. LOAD DATA LOCAL INFILE مخصص لجهاز العميل ، لكنه يتطلب بدء الخادم بالإعدادات الصحيحة ، وإلا فإنه غير مسموح به. يمكنك قراءة كل شيء هنا: http://dev.mysql.com/doc/refman/5.0/en/load-data-local.html

أما بالنسبة لل SELECT INTO OUTFILE لست متأكدًا من سبب عدم وجود نسخة محلية ، إلى جانب أنه من الصعوبة في الاتصال. يمكنك الحصول على نفس الوظيفة من خلال mysqldump أداة ، ولكن ليس من خلال إرسال SQL إلى الخادم.

باستخدام MySQL CLI مع خيار -e كما يقترح Waverly360 ، يعد أمرًا جيدًا ، لكن هذا قد يخرج عن الذاكرة ويقتل بنتائج كبيرة. (لم يجد السبب وراء ذلك). إذا كان هذا هو الحال ، وكنت بحاجة إلى جميع السجلات ، فإن الحل الخاص بي هو: mysqldump + mysqldump2csv:

wget https://raw.githubusercontent.com/jamesmishra/mysqldump-to-csv/master/mysqldump_to_csv.py
mysqldump -u username -p --host=hostname database table | python mysqldump_to_csv.py > table.csv

رد: حدد * في Outfile

تحقق مما إذا كان MySQL لديه أذونات لكتابة ملف إلى دليل Outfile على الخادم.

بما أنني أجد نفسي أبحث بانتظام عن هذه المشكلة الدقيقة (على أمل فاتني شيء ما قبل ...) ، قررت أخيرًا قضاء الوقت وكتابة أ جوهر صغير لتصدير استعلامات mysql كملفات CSV, ، كيندا مثل https://stackoverflow.com/a/28168869 ولكن بناءً على PHP ومع بضع خيارات أخرى. كان هذا أمرًا مهمًا لحالة الاستخدام الخاصة بي ، لأنني بحاجة إلى أن أكون قادرًا على ضبط معلمات CSV (محدد ، معالجة القيمة الفارغة) والملفات يجب أن تكون في الواقع CSV ، بحيث يكون ذلك بسيطًا CONCAT لا يكفي لأنه لا يولد ملفات CSV صالحة إذا كانت القيم تحتوي على فترات سطر أو محدد CSV.

تحذير: يتطلب تثبيت PHP على الخادم!(يمكن فحصها عبر php -v)

"تثبيت" mysql2csv عبر

wget https://gist.githubusercontent.com/paslandau/37bf787eab1b84fc7ae679d1823cf401/raw/29a48bb0a43f6750858e1ddec054d3552f3cbc45/mysql2csv -O mysql2csv -q && (sha256sum mysql2csv | cmp <(echo "b109535b29733bd596ecc8608e008732e617e97906f119c66dd7cf6ab2865a65  mysql2csv") || (echo "ERROR comparing hash, Found:" ;sha256sum mysql2csv) ) && chmod +x mysql2csv

(قم بتنزيل محتوى GIST ، والتحقق من Checksum وجعله قابل للتنفيذ)

مثال الاستخدام

./mysql2csv --file="/tmp/result.csv" --query='SELECT 1 as foo, 2 as bar;' --user="username" --password="password"

يولد الملف /tmp/result.csv مع المحتوى

foo,bar
1,2

مساعدة للرجوع إليها

./mysql2csv --help
Helper command to export data for an arbitrary mysql query into a CSV file.
Especially helpful if the use of "SELECT ... INTO OUTFILE" is not an option, e.g.
because the mysql server is running on a remote host.

Usage example:
./mysql2csv --file="/tmp/result.csv" --query='SELECT 1 as foo, 2 as bar;' --user="username" --password="password"

cat /tmp/result.csv

Options:
        -q,--query=name [required]
                The query string to extract data from mysql.
        -h,--host=name
                (Default: 127.0.0.1) The hostname of the mysql server.
        -D,--database=name
                The default database.
        -P,--port=name
                (Default: 3306) The port of the mysql server.
        -u,--user=name
                The username to connect to the mysql server.
        -p,--password=name
                The password to connect to the mysql server.
        -F,--file=name
                (Default: php://stdout) The filename to export the query result to ('php://stdout' prints to console).
        -L,--delimiter=name
                (Default: ,) The CSV delimiter.
        -C,--enclosure=name
                (Default: ") The CSV enclosure (that is used to enclose values that contain special characters).
        -E,--escape=name
                (Default: \) The CSV escape character.
        -N,--null=name
                (Default: \N) The value that is used to replace NULL values in the CSV file.
        -H,--header=name
                (Default: 1) If '0', the resulting CSV file does not contain headers.
        --help
                Prints the help for this command.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top