mysql load data infile localhost - mysql

I'm loading a csv file into a mysql instance running on local host. I can do this using the LOAD DATA LOCAL INFILE syntax, but what I'm wondering is why I need the LOCAL if the server and file are on the same machine. Without the local, I get an error saying:
ERROR 13 (HY000): Can't get stat of '/path/to/myfile.csv' (Errcode: 13)

That is because the system account under which MySQL is working have no rights to read this file.
When you don't specify LOCAL the file is being read directly by the MySQL server process and have to have rights to read this file.
When you add LOCAL the file is being read by mysql client program not the server process and in your case apparently has access to your csv file, which is I presume is located somewhere in the user directory of an account under which you're working.
If you put this file to a directory where MySQL process has rights to read from (e.g. /tmp/myfile.csv) LOAD DATA INFILE will work just fine.
LOAD DATA INFILE
The LOCAL keyword affects where the file is
expected to be found:
If LOCAL is specified, the file is read by the client program on the client host and sent to the server. The file can be given as a full
path name to specify its exact location. If given as a relative path
name, the name is interpreted relative to the directory in which the
client program was started.
If LOCAL is not specified, the file must be located on the server host and is read directly by the server.

The best place to look these up are in MySQL docs. Check out http://dev.mysql.com/doc/refman/5.1/en/load-data.html
The --local option causes mysqlimport to read data files from the
client host.

Related

load records into mysql table from csv

I'm running mysql v8.0.24 on ubuntu server. I have created a table called uranium in the database stocks. I'm now trying to run the command below in mysql as root, to load records from a csv on the server into the table. I'm getting the error below, does anyone see what the issue might be and can you suggest how to fix it?
code:
LOAD DATA INFILE '/home/user/uranium.csv' INTO TABLE stocks.uranium FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS;
error:
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
By default MySQL has secure_file_priv set, which restricts the directories that it will access for INFILE and OUTFILE operations. You can set the MySQL configuration to allow a nominated folder by editing the [mysqld] section of mysql.cnf*.
Ubuntu also has AppArmor running, that will prevent MySQL from seeing the file even if it has the correct permissions. You will need to update that too.
For this reason I recommend you create a dedicated directory for this sort of import, rather than using a home directory. For the purposes of this answer I have use /sqlfiles.
For Ubuntu and other Debian derived versions of Linux, go to /etc/mysql/mysql.conf.d
Using your favourite editor, edit the file mysql.cnf that you find there. (There are other files with the same name elsewhere in the /etc/mysql directory. Make sure you're editing the correct one)
At the end of the [mysqld] section add the line
secure-file-priv=/sqlfiles
Save the file, then create the folder and set the ownership to mysql
sudo mkdir /sqlfiles
sudo chown mysql:mysql /sqlfiles
Now update the AppArmor profile. Go to /etc/apparmor.d/local and edit the file usr.sbin.mysqld. Add these lines to the end of that file:
/sqlfiles/ r,
/sqlfiles/** rwk,
Finally, restart AppArmor
sudo service apparmor restart
This is working on my development server running Ubuntu 20.04, MySQL 8.0.24
Good luck!
* If you create the entry in mysql.cnf but leave the filename blank you will disable the effect of the variable, and MySQL will read or write to any folder. AppArmor will still prevent access unless you update that too.
Look at this answer
In spite the fact that your csv file is located on the server's file system, I think you should include LOCAL keyword:
LOAD DATA LOCAL INFILE ...
Or
The file has to be located in the database directory or have world
read permissions, and the client username must have the FILE
privilege.
I think your csv file is not
...located in the database directory or have world read permissions...
Note that
...client username must have the FILE privilege...
MySql8 documentation: doc and doc
LOAD DATA INFILE gets the file from the database server's local
filesystem. The file has to be located in the database directory or
have world read permissions, and the client username must have the
FILE privilege.
LOAD DATA LOCAL INFILE reads the file on the client, and sends the
contents to the server.
You can find more details in the documentation.
And
If LOCAL is specified, the file is read by the client program on the client host and sent to the server.
If LOCAL is not specified, the file must be located on the server host and is read directly by the server.
Credit goes to barmar and tim-biegeleisen

MySQL 8.0 / Workbench on Windows : Error Code: 2068. LOAD DATA LOCAL INFILE file request rejected due to restrictions on access

I'm trying to run a LOAD DATA LOCAL INFILE from a file on my C:\ drive into an existent table, logged at root in Workbench. I've researched it all afternoon, set local_infile=1, set secure_file_priv='', granted file access to my user, flushed privileges, tried forward and backslashes but can't seem to get round the problem. Error 2068 doesn't really tell you much in the manual either. Any other suggestions?
I'm running on Windows 10, latest MySQL versions (as of last week - its a fresh install) and the table I'm trying to insert into is really simple. Its clearly a permissions problem, but running as root on a windows instance where I'm admin surely shouldn't be a problem?
Code is "LOAD DATA LOCAL INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/filename.csv' INTO TABLE tablename;
You should check that folder where the file you are trying to load is and confirm that you have the necessary permissions. If you have the permissions for the folder then check the file. You should used the properties options by right clicking on the folder or on the file.
Properties Window
EDIT:
Also try the instruction with only LOAD DATA INFILE without the LOCAL statement. That made it worked for me.

MySQL LOAD DATA LOCAL INFILE to a remote server

I want to import a csv file from my local computer to a mysql server on a remote machine using LOAD DATA LOCAL INFILE. When I try this without LOCAL and my file is stored at the remote computer it works (file and mysql on the same server), but is not working when the mysql server is on a remote computer.
LOAD DATA LOCAL INFILE 'C:/wamp/www/accesos/uploaded_files/wawawa.csv'
INTO TABLE eventos
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
(#skip,#skip,#skip,#skip,#skip,#skip,#skip,#skip,#skip,nombre,#skip,num_servo,#fecha,hora,#skip,num_tarjeta,#archivo_procedencia)
set archivo_procedencia = 'test_file', fecha = STR_TO_DATE(#fecha, '%d/%m/%Y');
So, what I'm doing from my computer: I'm connecting to phpmyadmin on the remote computer.
Executing the above code but is not working. But it works if I remove "LOCAL" and move my file to the remote computer and change the path to match the file path.
The error is:
Can't find file 'C:/wamp/www/accesos/uploaded_files/wawawa.csv'.
Any ideas on how to do this?
From documentation:
The LOCAL keyword affects expected location of the file and error handling, as described later. LOCAL works only if your server and your client both have been configured to permit it. For example, if mysqld was started with --local-infile=0, LOCAL does not work. See Section 6.1.6, “Security Issues with LOAD DATA LOCAL”.
The LOCAL keyword affects where the file is expected to be found:
If LOCAL is specified, the file is read by the client program on the client host and sent to the server. The file can be given as a full path name to specify its exact location.
In Your case client program is phpmyadmin. So it expects csv file is on server where phpmyadmin is installed. To work with files on your local computer, you must use MySQL client program installed locally on your computer.
The LOAD DATA INFILE statement loads a file on machine the MySQL server is running on. (the remote server)
Use LOAD DATA LOCAL INFILE to load a file located on your local machine.

Load Data infile database access Permissions / privileges

I need to load a CSV file from client machine to MySQL server database.
I am trying LOAD DATA INFILE.
My confusion is regarding ACCESS PERMISSIONs required to use
- LOAD DATA INFILE
- LOAD DATA LOCAL INFILE
Earlier I believed that I need FILE privilege to use both of them.
I came across this line in mysql documentation :
when reading text files located on the server, the files must either reside in the database directory or be readable by all. Also, to use LOAD DATA INFILE on server files, you must have the FILE privilege. See Section 6.2.1, “Privileges Provided by MySQL”. For non-LOCAL load operations, if the secure_file_priv system variable is set to a nonempty directory name, the file to be loaded must be located in that directory.
Looking at this, I got confused.
Do I need FILE privilege to load FILE from client machine using LOCAL option?
We do not need FILE privilege to LOAD data-file from a remote machine to MySQL Server. We need --local-infile option on Client machine enabled for that.
We need FILE privilege when we are trying to LOAD a data-file which is present on MySQL server. Additionally, mysql demon should also have access to READ from directory where data-file is placed.

Howto LoadFILE from Remote file

How can I load a file with "MySQL LOAD FILE" features from remote server?
As stated in the manual for LOAD DATA, you can use the LOCAL keyword:
The LOCAL keyword, if specified, is interpreted with respect to the client end of the connection:
If LOCAL is specified, the file is read by the client program on the client host and sent to the server. The file can be given as a full path name to specify its exact location. If given as a relative path name, the name is interpreted relative to the directory in which the client program was started.
When using LOCAL with LOAD DATA, a copy of the file is created in the server's temporary directory. This is not the directory determined by the value of tmpdir or slave_load_tmpdir, but rather the operating system's temporary directory, and is not configurable in the MySQL Server. (Typically the system temporary directory is /tmp on Linux systems and C:\WINDOWS\TEMP on Windows.) Lack of sufficient space for the copy in this directory can cause the LOAD DATA LOCAL statement to fail.
If LOCAL is not specified, the file must be located on the server host and is read directly by the server. The server uses the following rules to locate the file:
If the file name is an absolute path name, the server uses it as given.
If the file name is a relative path name with one or more leading components, the server searches for the file relative to the server's data directory.
If a file name with no leading components is given, the server looks for the file in the database directory of the default database.
Note that, in the non-LOCAL case, these rules mean that a file named as ./myfile.txt is read from the server's data directory, whereas the file named as myfile.txt is read from the database directory of the default database. For example, if db1 is the default database, the following LOAD DATA statement reads the file data.txt from the database directory for db1, even though the statement explicitly loads the file into a table in the db2 database:
LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table;
Windows path names are specified using forward slashes rather than backslashes. If you do use backslashes, you must double them.
For security reasons, when reading text files located on the server, the files must either reside in the database directory or be readable by all. Also, to use LOAD DATA INFILE on server files, you must have the FILE privilege. See Section 6.2.1, “Privileges Provided by MySQL”. For non-LOCAL load operations, if the secure_file_priv system variable is set to a nonempty directory name, the file to be loaded must be located in that directory.
Using LOCAL is a bit slower than letting the server access the files directly, because the contents of the file must be sent over the connection by the client to the server. On the other hand, you do not need the FILE privilege to load local files.
With LOCAL, the default duplicate-key handling behavior is the same as if IGNORE is specified; this is because the server has no way to stop transmission of the file in the middle of the operation. IGNORE is explained further later in this section.
LOCAL works only if your server and your client both have been configured to permit it. For example, if mysqld was started with --local-infile=0, LOCAL does not work. See Section 6.1.6, “Security Issues with LOAD DATA LOCAL”.