it-swarm-eu.dev

Nelze odeslat data MySQL do souboru

Snažím se přenést data z tabulky MySQL do souboru, ale dostávám chyby oprávnění:

$ pwd
/home/dotancohen
$ mkdir in
$ chmod 777 in/
$ mysql -ugs -p
mysql> USE someDatabase;
mysql> SELECT * FROM data INTO OUTFILE '/home/dotancohen/in/data.csv';
ERROR 1045 (28000): Access denied for user 'gs'@'localhost' (using password: YES)
mysql>

Pokud je dotyčný adresář chmodded na 777, proč nemůže uživatel MySQL soubor zapsat? Je zajímavé, že ani nemůžu zapisovat do/tmp /.

EDIT: Vypadá to, že uživatel DB má správná oprávnění MySQL:

mysql> show grants;
+----------------------------------------------------------------------------------+
| Grants for [email protected]                                                          |
+----------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'gs'@'localhost' IDENTIFIED BY PASSWORD 'somePassword'     | 
| GRANT ALL PRIVILEGES ON `gs\_%`.* TO 'gs'@'localhost'                            | 
+----------------------------------------------------------------------------------+
2 rows in set (0.01 sec)
13
dotancohen

Podle dokumentace MySQL na VYBRAT ... DO OUTFILE

Jakýkoli soubor vytvořený INTO OUTFILE nebo INTO DUMPFILE je zapisovatelný všemi uživateli na serveru Host. Důvod je ten, že server MySQL nemůže vytvořit soubor, který je vlastněn kýmkoli jiným než uživatelem, pod jehož účtem je spuštěn. (Nikdy byste neměli spouštět mysqld jako root z tohoto a dalších důvodů.) Soubor tedy musí být zapisovatelný na světě, abyste mohli manipulovat s jeho obsahem.

Měli byste vydat SELECT INTO OUTFILE to/var/lib/mysql následovně

SELECT * FROM data INTO OUTFILE 'data.csv';

Samozřejmě se musíte ujistit, že máte oprávnění k FILE na gs @ localhost.

Toto povolení lze udělit dvěma způsoby

METODA # 1

GRANT FILE ON *.* TO 'gs'@'localhost';

METODA # 2

UPDATE mysql.user SET File_priv = 'Y' WHERE user='gs' AND Host='localhost';
FLUSH PRIVILEGES;

UPDATE 2012-05-01 07:09 EDT

Chcete-li získat oprávnění FILE, proveďte následující:

  • KROK 01) service mysql restart --skip-networking --skip-grant-tables
  • KROK 02) mysql <hit enter>
  • KROK 03) UPDATE mysql.user SET File_priv = 'Y' WHERE user='gs' AND Host='localhost';
  • KROK 04) exit
  • KROK 05) service mysql restart
12
RolandoMySQLDBA

Různá distribuce a operační systémy ne všechny zpracovávají destinace pro OUTFILE stejně.

Například při spuštění démona mysqld v systému Linux, který používá soket, je OUTFILE někdy zapsán do /tmp adresář. Není to moc, pouze to, že přístup OUTFILE má nedostatky, jmenovitě vypořádání s oprávněními a nalezení místa, kam soubor šel.

Vzhledem k tomu, že cílem této otázky není konkrétně „Jak používat OUTFILE“, ale právě se chystáte zachytit některá data MySQL do souboru, zde je alternativa, která nevyžaduje, abyste se obcházeli s oprávněními FILE atd. .

$ (echo 'SELECT * FROM data' | mysql -ugs -p[password])> /home/dotancohen/in/data.csv

Výstup je ve výchozím nastavení oddělený tabulátory. V případě čárky jej před zápisem do souboru jednoduše převeďte skrz sed nebo něco.

1
AaronDanielson

Strávil jsem hodiny pokusem porozumět návrhům na této stránce a mnoha dalším stránkám StackOverflow.

Bez ohledu na to, jak jsem změnil oprávnění v MySql, nemohl jsem dostat nic do práce.

Vrátil jsem se zpět na oprávnění, které jsem začal.

Nakonec to, co pro mě fungovalo, bylo jednodušší než návrhy ostatních:

echo "select id, emailAddress FROM contacts" | mysql --user=myusername --password mydatabasename > /home/my_output_file.tsv

1
Ryan

Pokud jde o dvě výše uvedené metody pro výstup dat do CSV (mělo by to být skutečně TSV), zjistil jsem, že pokud existují prázdné hodnoty v záznamech, které Pokud exportujete, existuje riziko, že by data mohla být zaslána chybným umístěním dat do odpovídajících sloupců.

S ohledem na integritu dat pro obnovení jsem našel tento web:

https://www.eversql.com/exporting-mysql-schema-structure-to-xml-using-mysql-clients/

Zmínilo se, že --xml volba v mysqldump umožňuje exportovat data do formátu XML, který pak lze pomocí vlastního skriptu analyzovat do jakéhokoli potřebného formátu, včetně TSV.

0
Nguyen H Chan