Ubuntu下MariaDB用INTO OUTFILE导出SQL结果的权限及覆盖问题咨询
MariaDB INTO OUTFILE 权限与导出问题解决方案
问题1:如何让导出文件的属主属组为当前用户joe:joe
INTO OUTFILE是MariaDB服务端执行的写入操作,服务进程默认以mysql用户身份运行,Linux系统默认限制普通进程将文件属主修改为其他用户,因此原生服务端导出无法直接生成joe:joe属主的文件,可通过两种方案规避:
- 改用客户端导出:使用DBeaver的查询结果导出功能,或者命令行执行重定向导出,生成的文件直接归当前执行命令的joe用户所有:
mysql -u joe -p referals -e "select * from referalList;" > ~/testOutFileReferalList.csv - 服务端导出后自动修改权限:写shell脚本执行导出操作,导出完成后自动执行
chown修改权限:sudo chown joe:joe /var/lib/mysql/referals/testOutFileReferalList.csv
问题2:如何将文件导出到任意路径(如家目录)
报错是多重权限限制共同导致的,按以下步骤配置即可:
- 首先调整
secure_file_priv参数:执行SQLshow variables like 'secure_file_priv';查看当前值,该参数限制了MariaDB服务端的文件导出路径:- 若值为固定路径:仅允许导出到该路径下
- 若值为
NULL:完全禁止服务端文件导出 - 若值为空:无路径限制
要放开限制,编辑/etc/mysql/mariadb.conf.d/50-server.cnf,在[mysqld]段添加以下配置后重启服务:
重启命令:secure_file_priv = ""sudo systemctl restart mariadb - 配置目标路径的文件系统权限:建议单独新建一个导出目录避免修改家目录默认权限,执行以下命令给mysql用户开放目录读写权限:
mkdir ~/mysql_export sudo apt install acl -y setfacl -m u:mysql:rwx ~/mysql_export - 放开AppArmor限制(Ubuntu默认开启):编辑
/etc/apparmor.d/usr.sbin.mysqld,在文件权限规则段添加一行:
重载AppArmor规则:/home/joe/mysql_export/** rwk,sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqld
完成以上配置后即可直接导出到/home/joe/mysql_export路径下。
问题3:如何让MariaDB导出时自动覆盖已存在的同名文件
原生INTO OUTFILE出于安全设计不支持覆盖已有文件,可通过两种方案实现覆盖需求:
- 改用客户端导出:上文中提到的命令行重定向导出,使用
>符号默认就是覆盖已有文件 - 服务端导出前先删除旧文件:写shell脚本执行导出操作,导出前判断旧文件存在则删除,示例脚本:
#!/bin/bash EXPORT_PATH="/home/joe/mysql_export/testOutFileReferalList.csv" # 存在旧文件则删除 [ -f "$EXPORT_PATH" ] && sudo rm -f "$EXPORT_PATH" # 执行导出 mysql -u root -p referals -e "select * from referalList INTO OUTFILE '$EXPORT_PATH';" # 修改权限为joe所有 sudo chown joe:joe "$EXPORT_PATH"
内容的提问来源于stack exchange,提问作者Joe Molnar
相关产品推荐
相关产品推荐

