MySQL导出CSV文件报错secure-file-priv权限受限mac

MySQL导出文件遇到secure-file-priv报错

前两天在电脑上安装了MySQL 8.0.18,在尝试从数据库导出csv文件时,遇到了以下报错:

ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

secure-file-priv资料查询

上网一搜发现报错原因和secure-file-priv的值有关,secure-file-priv参数是用来限制mysql导入导出到哪个目录的

查阅官方文档找到secure-file-priv的值有以下几种情况:

secure-file-priv取值

而使用命令 show variables like "%secu%"; 检查secure-file-priv的值,发现本地secure_file_priv的值设置的是NULL,那么就需要将secure_file_priv的值设置为空字符串或者dirname才能导出文件。

屏幕快照 2019-10-31 22.12.50.png

解决办法

那么接着问题来了,在哪里设置secure-file-priv的值呢?

不能直接设置,必须要在my.cnf文件里设置(mac在my.cnf)。

那么my.cnf文件在哪里呢?

在下面3个关键目录中使用find命令全部搜了一遍也没有找到my.cnf文件,没有办法只有在网上重新找了一个my.cnf文件。

/etc
/usr/local/mysql/support-files
/usr/local/mysql-8.0.18-macos10.14-x86_64/support-files

在找到my.cnf后,进入/etc目录下,使用sudo vim my.cnf命令新建my.cnf文件,并将以下内容添加到my.cnf文件中。

# Example MySQL config file for medium systems.  
  #  
  # This is for a system with little memory (32M - 64M) where MySQL plays  
  # an important part, or systems up to 128M where MySQL is used together with  
  # other programs (such as a web server)  
  #  
  # MySQL programs look for option files in a set of  
  # locations which depend on the deployment platform.  
  # You can copy this option file to one of those  
  # locations. For information about these locations, see:  
  # http://dev.mysql.com/doc/mysql/en/option-files.html  
  #  
  # In this file, you can use all long options that a program supports.  
  # If you want to know which options a program supports, run the program  
  # with the "--help" option.  
  # The following options will be passed to all MySQL clients  
  [client]
  default-character-set=utf8
  password   = your_password
  port        = 3306  
  socket      = /tmp/mysql.sock   
  # Here follows entries for some specific programs  
  # The MySQL server  
  [mysqld]
  character-set-server=utf8
  init_connect='SET NAMES utf8
  port        = 3306  
  socket      = /tmp/mysql.sock  
  skip-external-locking  
  key_buffer_size = 16M  
  max_allowed_packet = 1M  
  table_open_cache = 64  
  sort_buffer_size = 512K  
  net_buffer_length = 8K  
  read_buffer_size = 256K  
  read_rnd_buffer_size = 512K  
  myisam_sort_buffer_size = 8M  
  character-set-server=utf8  
  init_connect='SET NAMES utf8' 
  secure_file_priv=''
# Don't listen on a TCP/IP port at all. This can be a security enhancement,  
# if all processes that need to connect to mysqld run on the same host.  
# All interaction with mysqld must be made via Unix sockets or named pipes.  
# Note that using this option without enabling named pipes on Windows  
# (via the "enable-named-pipe" option) will render mysqld useless!  
#   
#skip-networking  

  # Replication Master Server (default)  
  # binary logging is required for replication  
  log-bin=mysql-bin  

    # binary logging format - mixed recommended  
    binlog_format=mixed  

      # required unique id between 1 and 2^32 - 1  
      # defaults to 1 if master-host is not set  
      # but will not function as a master if omitted  
      server-id   = 1  

    # Replication Slave (comment out master section to use this)  
    #  
    # To configure this host as a replication slave, you can choose between  
    # two methods :  
    #  
    # 1) Use the CHANGE MASTER TO command (fully described in our manual) -  
    #    the syntax is:  
    #  
    #    CHANGE MASTER TO MASTER_HOST=, MASTER_PORT=,  
    #    MASTER_USER=, MASTER_PASSWORD= ;  
    #  
    #    where you replace , ,  by quoted strings and  
    #     by the master's port number (3306 by default).  
    #  
    #    Example:  
    #  
    #    CHANGE MASTER TO MASTER_HOST='125.564.12.1', MASTER_PORT=3306,  
    #    MASTER_USER='joe', MASTER_PASSWORD='secret';  
    #  
    # OR  
    #  
    # 2) Set the variables below. However, in case you choose this method, then  
    #    start replication for the first time (even unsuccessfully, for example  
    #    if you mistyped the password in master-password and the slave fails to  
    #    connect), the slave will create a master.info file, and any later  
    #    change in this file to the variables' values below will be ignored and  
    #    overridden by the content of the master.info file, unless you shutdown  
    #    the slave server, delete master.info and restart the slaver server.  
    #    For that reason, you may want to leave the lines below untouched  
    #    (commented) and instead use CHANGE MASTER TO (see above)  
    #  
    # required unique id between 2 and 2^32 - 1  
    # (and different from the master)  
    # defaults to 2 if master-host is set  
    # but will not function as a slave if omitted  
    #server-id       = 2  
    #  
    # The replication master for this slave - required  
    #master-host     =     
    #  
    # The username the slave will use for authentication when connecting  
    # to the master - required  
    #master-user     =     
    #  
    # The password the slave will authenticate with when connecting to  
    # the master - required  
    #master-password =     
    #  
    # The port the master is listening on.  
    # optional - defaults to 3306  
    #master-port     =    
    #  
    # binary logging - not required for slaves, but recommended  
    #log-bin=mysql-bin  

      # Uncomment the following if you are using InnoDB tables  
      #innodb_data_home_dir = /usr/local/mysql/data  
      #innodb_data_file_path = ibdata1:10M:autoextend  
      #innodb_log_group_home_dir = /usr/local/mysql/data  
      # You can set .._buffer_pool_size up to 50 - 80 %  
      # of RAM but beware of setting memory usage too high  
      #innodb_buffer_pool_size = 16M  
      #innodb_additional_mem_pool_size = 2M  
      # Set .._log_file_size to 25 % of buffer pool size  
      #innodb_log_file_size = 5M  
      #innodb_log_buffer_size = 8M  
      #innodb_flush_log_at_trx_commit = 1  
      #innodb_lock_wait_timeout = 50  

        [mysqldump]  
        quick  
        max_allowed_packet = 16M  

          [mysql]  
          no-auto-rehash  
          # Remove the next comment character if you are not familiar with SQL  
          #safe-updates  
          default-character-set=utf8   

        [myisamchk]  
        key_buffer_size = 20M  
        sort_buffer_size = 20M  
        read_buffer = 2M  
        write_buffer = 2M  

          [mysqlhotcopy]  
          interactive-timeout

注意!!!

一定要把上面文本中的password = your_password修改成自己的MySQL数据库的密码,我就是忘记改了,搞了3天,不管怎么修改secure_file_priv='',在重启数据库都没有用,终于在第3天重新梳理了一遍流程,仔细研究了my.cnf文件后,发现了问题所在。

修改好后,在系统偏好设置的MySQL中配置Configuration File文件,重新Apply然后再重启MySQL服务就可以了。

屏幕快照 2019-10-31 23.33.50.png

见证奇迹的时刻

一切准备就绪,让我们重新再来导出一次user表

mysql> select * from user into outfile '/tmp/user.csv';
Query OK, 4 rows affected (0.00 sec)

大功告成!

补充

虽然secure_file_priv设置为空字符串,也就是说可以任意导入导出到任何文件目录下,但是我也试了桌面和etc文件夹,都导出失败了,上网查询原因可能与文件访问权限、文件分组有关,这里就不再详细讨论了,/tmp目录是可以导入导出的,大家可以在这个目录下导出csv文件。

mysql> select * from user into outfile '~/Desktop/user/user.csv';
ERROR 1 (HY000): Can't create/write to file '/var/empty/Desktop/user/user.csv' (OS errno 2 - No such file or directory)
mysql> select * from user into outfile '/etc/user.csv';
ERROR 1 (HY000): Can't create/write to file '/etc/user.csv' (OS errno 13 - Permission denied)

参考文章:

  • MySQL官方开发者文档对secure_file_priv变量的描述
  • mac os上mysql secure-file-priv导入文件权限解决方案

如果对你有帮助的话,点赞、评论、赞赏都是对我的鼓励,也是支持我写下去的动力,谢谢!

你可能感兴趣的:(MySQL导出CSV文件报错secure-file-priv权限受限mac)