本文目錄一覽:
- 1、Navicat導出mysql數據庫時出錯怎麼解決?
- 2、Mysql無法導出
- 3、求助啊、、、mysql導出文本文件出錯了 error 1 (hy000): Can’t creat
- 4、mysql怎麼導出數據
- 5、MySQL數據庫導出與導入及常見錯誤解決
- 6、求助:為什麼 mysql8.0版本在my.ini中修改了secure_file_priv,重啟服務之後,還是無法導出啊
Navicat導出mysql數據庫時出錯怎麼解決?
項目上 MySQL 還原 SQL 備份經常會碰到一個錯誤如下,且通常出現在導入視圖、函數、存儲過程、事件等對象時,其根本原因就是因為導入時所用賬號並不具有SUPER 權限,所以無法創建其他賬號的所屬對象。ERROR 1227 (42000) : Access denied; you need (at least one of) the SUPER privilege(s) for this operation常見場景:1. 還原 RDS 時經常出現,因為 RDS 不提供 SUPER 權限;2. 由開發庫還原到項目現場,賬號權限等有所不同。
處理方式:
1. 在原庫中批量修改對象所有者為導入賬號或修改 SQL SECURITY 為 Invoker;2. 使用 mysqldump 導出備份,然後將 SQL 文件中的對象所有者替換為導入賬號。
二、問題原因我們先來看下為啥會出現這個報錯,那就得說下 MySQL 中一個很特別的權限控制機制,像視圖、函數、存儲過程、觸發器等這些數據對象會存在一個 DEFINER 和一個 SQL SECURITY 的屬性,如下所示:
–視圖定義CREATE ALGORITHM = UNDEFINED DEFINER = `root`@`%` SQL SECURITY DEFINER VIEW v_test
–函數定義CREATE DEFINER=`root`@`%` FUNCTION `f_test()` RETURNS varchar(100) SQL SECURITY DEFINER
–存儲過程定義CREATE DEFINER=`root`@`%` PROCEDURE `p_test`() SQL SECURITY DEFINER
–觸發器定義CREATE DEFINER=`root`@`%` trigger t_test
–事件定義CREATE DEFINER=`root`@`%` EVENT `e_test`
DEFINER:對象定義者,在創建對象時可以手動指定用戶,不指定的話默認為當前連接用戶;
SQL SECURITY:指明以誰的權限來執行該對象,有兩個選項,一個為 DEFINER,一個為 INVOKER,默認情況下系統指定為 DEFINER;DEFINER:表示按定義者的權限來執行; INVOKER:表示按調用者的權限來執行。
如果導入賬號具有 SUPER 權限,即使對象的所有者賬號不存在,也可以導入成功,但是在查詢對象時,如果對象的 SQL SECURITY 為 DEFINER,則會報賬號不存在的報錯。ERROR 1449 (HY000): The user specified as a definer (‘root’@’%’) does not exist
改寫好處:1. 可以避免還原時遇到 DEFINER 報錯相關問題;2. 根據輸出信息知道備份是否正常進行,防止備份中遇到元數據鎖無法獲取然後一直卡住的情況。
Mysql無法導出
你沒有重定向輸出的目標文件。
如果沒有指定目標文件,mysqldump默認將結果print出來。
mysqldump -h localhost -u root -p test backup.sql
求助啊、、、mysql導出文本文件出錯了 error 1 (hy000): Can’t creat
出現該問題的原因一般都是向沒有權限的文件或是目錄寫東西,然後報錯個人總結
解決方法如下 以select …. into file
為例
1 select ….. into outfile ‘/tmp/target.txt’
2使用數據庫目錄
select ….. into outfile
‘/var/lib/mysql/target.txt’
root:@localhost[mytest]select * from me into
outfile ‘/var/lib/mysql/target.txt’ ;
Query OK, 3 rows affected (0.00
sec)
3 使用默認目錄
root:@localhost[mytest]select * from me into
outfile ‘target.txt’;
Query OK, 3 rows affected (0.00 sec)
4
我們給出我們的分析思路:
首先我們以用戶ububu login :
目錄的權限是:
ubutu@ubutu-desktop:~$ mkdir
test
ubutu@ubutu-desktop:~$ ls -lai test
總計 8
16423 drwxr-xr-x 2
ubutu ubutu 4096 2010-03-24 19:59 .
8177 drwxr-xr-x 77 ubutu ubutu 4096
2010-03-24 19:59 ..
login mysql
(注意雜mysql中我們是以root用戶登錄的)
root:@localhost[mytest]select * from me into
outfile ‘/home/ubutu/test/a.txt’;
ERROR 1 (HY000): Can’t create/write to file
‘/home/ubutu/test/a.txt’ (Errcode:
13)
報錯:
我們修改目錄的權限:
oot@ubutu-desktop:/home/ubutu# chown -R mysql:mysql
test/
root@ubutu-desktop:/home/ubutu# ls -lai test
總計 8
16423
drwxr-xr-x 2 mysql mysql 4096 2010-03-24 19:59 .
8177 drwxr-xr-x 77 ubutu
ubutu 4096 2010-03-24 19:59
..
在繼續執行:錯誤依舊:
我們繼續修改:
root@ubutu-desktop:/home/ubutu# chmod a+wx
test/
root@ubutu-desktop:/home/ubutu# ls -lai test
總計 8
16423
drwxrwxrwx 2 mysql mysql 4096 2010-03-24 19:59 .
8177 drwxr-xr-x 77 ubutu
ubutu 4096 2010-03-24 19:59
..
錯誤仍在繼續:
接着我們嘗試用操作系統帳戶登錄:
root@ubutu-desktop:~# mysql
root:@localhost[mytest]select * from me into outfile
‘/home/ubutu/test/a.txt’
– ;
ERROR 1 (HY000): Can’t create/write to
file ‘/home/ubutu/test/a.txt’ (Errcode:
13)
仍是同樣的錯誤,無語了。為了查找錯誤的原因,我們從上面成功的例子我們看看那文件的權限:
root@ubutu-desktop:/var/lib/mysql#
ls -lai target.txt
2510 -rw-rw-rw- 1 root root 6 2010-03-24 20:07
target.txt(123使用操作系統的一般用戶登錄,但是mysql的root用戶操作得到的結果)
我們看到文件的拳限是:root
,可是面我們使用chmod a+wx 仍然不行,問題處在那呢?難道是selinux ?
然後我們在/etc/apparmor
裡面發現了這個:
capability setuid,
network tcp,
/etc/hosts.allow
r,
/etc/hosts.deny r,
/etc/mysql/*.pem r,
/etc/mysql/conf.d/
r,
/etc/mysql/conf.d/* r,
/etc/mysql/my.cnf r,
/usr/sbin/mysqld
mr,
/usr/share/mysql/** r,
/var/log/mysql.log rw,
/var/log/mysql.err
rw,
/var/lib/mysql/ r,
/var/lib/mysql/** rwk,
/var/log/mysql/
r,
/var/log/mysql/* rw,
/var/run/mysqld/mysqld.pid
w,
/var/run/mysqld/mysqld.sock w,
}
網上一搜,發現:
AppArmor attempts to
protect processes on the server or desktop from security threats. AppArmor
enforces limits on what processes can access on the system. It attempts to
restrict processes to those resources that the process requires to function
only. AppArmor will not only define the system resources a program can access ,
it will also determine the privileges with which it can access those resources.
To protect applications you will need to set up a security profile for each
application that you want to protect.
AppArmor has it’s history connected to
the Linux Security Modules and the SELinux project that was developed by the
National Security Agency. Both SELinux and AppArmor use these modules developed
with security in mind.
ubuntu :
Default enforcement
By default in a
new installation of the following services is done with AppArmor profiles
enforced:
* cups
* bind
* mysql
* slapd (Open
LDAP)
修改後的:
# vim:syntax=apparmor
# Last Modified: Tue Jun 19 17:37:30
2007
#include tunables/global
/usr/sbin/mysqld {
#include
abstractions/base
#include
abstractions/nameservice
#include
abstractions/user-tmp
#include abstractions/mysql
#include
abstractions/winbind
capability dac_override,
capability
sys_resource,
capability setgid,
capability setuid,
network
tcp,
/etc/hosts.allow r,
/etc/hosts.deny r,
/etc/mysql/*.pem
r,
/etc/mysql/conf.d/ r,
/etc/mysql/conf.d/* r,
/etc/mysql/my.cnf
r,
/usr/sbin/mysqld mr,
/usr/share/mysql/** r,
/var/log/mysql.log
rw,
/var/log/mysql.err rw,
/var/lib/mysql/ r,
/var/lib/mysql/**
rwk,
/var/ r,
/var/**
rwk,
/var/log/mysql/ r,
/var/log/mysql/*
rw,
/var/run/mysqld/mysqld.pid w,
/var/run/mysqld/mysqld.sock
w,
}
然後執行命令:
root:@localhost[mytest]select * from me into outfile
‘/var/data/target.txt’;
Query OK, 3 rows affected (0.00
sec)解決,該情況同樣使用於你想將現在的數據目錄執行更換,而出現的權限問題,即
自定義數據目錄。
寫的有點亂,邊實驗邊總結哈
mysql怎麼導出數據
1、 mysqldump命令備份數據
在MySQL中提供了命令行導出數據庫數據以及文件的一種方便的工具mysqldump,我們可以通過命令行直接實現數據庫內容的導出dump,首先我們簡單了解一下mysqldump命令用法:
#MySQLdump常用
mysqldump -u root -p –databases 數據庫1 數據庫2 xxx.sql
2、 mysqldump常用操作實例
2.1備份全部數據庫的數據和結構
mysqldump -uroot -p123456 -A /data/mysqlDump/mydb.sql
2.2備份全部數據庫的結構(加 -d 參數)
mysqldump -uroot -p123456 -A -d /data/mysqlDump/mydb.sql
2.3 備份全部數據庫的數據(加 -t 參數)
mysqldump -uroot -p123456 -A -t /data/mysqlDump/mydb.sql
2.4 備份單個數據庫的數據和結構(,數據庫名mydb)
mysqldump -uroot-p123456 mydb /data/mysqlDump/mydb.sql
2.5 備份單個數據庫的結構
mysqldump -uroot -p123456 mydb -d /data/mysqlDump/mydb.sql
2.6 備份單個數據庫的數據
mysqldump -uroot -p123456 mydb -t /data/mysqlDump/mydb.sql2
2.7 備份多個表的數據和結構(數據,結構的單獨備份方法與上同)
mysqldump -uroot -p123456 mydb t1 t2 /data/mysqlDump/mydb.sql
2.8 一次備份多個數據庫
mysqldump -uroot -p123456 –databases db1 db2 /data/mysqlDump/mydb.sql
MySQL數據庫導出與導入及常見錯誤解決
MySQL數據庫導出與導入的過程中將會發生眾多不可預知的錯誤,本文整理了一些常見錯誤及相應的解決方法,遇到類似情況的朋友可以參考下,希望對大家有所幫助
MySQL命令行導出數據庫:
1,進入MySQL目錄下的bin文件夾:cd
MySQL中到bin文件夾的目錄
如我輸入的命令行:cd
C:Program
FilesMySQLMySQL
Server
4.1bin
(或者直接將windows的環境變量path中添加該目錄)
2,導出數據庫:mysqldump
-u
用戶名
-p
數據庫名
導出的文件名
如我輸入的命令行:mysqldump
-u
root
-p
jluibmclub
d:
jluibmclub
.sql
(輸入後會讓你輸入進入MySQL的密碼)
(如果導出單張表的話在數據庫名後面輸入表名即可)
在用命令做數據庫備份過程在cmd命令框中輸入C:/mysql/binmysqldump
-uroot
-p
jluibmclub
d:
jluibmclub
.sql
;
報錯信息:mysqldump:
Got
error:
1049:
Unknown
database
‘
jluibmclub
;’
when
selecting
the
database
,識別不了
jluibmclub
這個數據庫。
但是我在:
mysql
show
databases;
顯示:
+—————+
|
Database
|
+—————+
|
jpa
|
+—————+
mysqluse
jpa;
顯示:
Database
changed
其原因很簡單,只要記住一點。沒進入mysql環境不算執行sql語句,所以不用在其後加入逗號(“;”)。
如果進入mysql環境mysql
,則輸入的語句屬於sql語句了,在其最後一定要加上逗號(“;”)。
3、會看到文件news.sql自動生成到d盤下文件,如果不指定盤符默認在bin目錄下。
命令行導入數據庫:
1,進入MySQL:mysql
-u
用戶名
-p
如我輸入的命令行:mysql
-u
root
-p
(輸入同樣後會讓你輸入MySQL的密碼)
2,在MySQL-Front中新建你要建的數據庫,這時是空數據庫,如新建一個名為news的目標數據庫
3,輸入:mysqluse
目標數據庫名
如我輸入的命令行:mysqluse
news;
4,導入文件:mysqlsource
導入的文件名;
如我輸入的命令行:mysqlsource
news.sql(如果在bin目錄下用相對路徑名,如果在其他目錄下用絕對目錄名);
MySQL備份和還原,都是利用mysqldump、mysql和source命令來完成的。
1.Win32下MySQL的備份與還原
求助:為什麼 mysql8.0版本在my.ini中修改了secure_file_priv,重啟服務之後,還是無法導出啊
打開my.cnf 或 my.ini,加入以下語句後重啟mysql實例
添加配置到[mysqld]下面配置塊、限制mysqld 不允許導入|導出
secure_file_priv=NULL
沒有指定具體值時,表示不對mysqld 的導入|導出做限制
secure_file_priv
限制mysqld 的導入|導出只能發生在/tmp/目錄下
secure_file_priv=/tmp/
通過RPM包或YUM安裝的默認一般為
secure_file_priv=”/var/lib/mysql-files/”
當secure_file_priv的值為右單斜杠時任意有權限的目錄
secure_file_priv=”/”
因此問題的排查可以兩步:
show global variables like ‘secure_file_priv’; 檢查生效路徑指向哪裡
該路徑對於啟動mysqld服務進程的用戶mysql/root等是否有讀寫權限
當然首先需要確認mysqld究竟從哪個my.cnf配置文件讀取的參數:
mysql –help | egrep ‘/my\.cnf|\.my\.cnf’ | xargs ls -l
原創文章,作者:DJTYY,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/324524.html