[Linux] 解決 mysql 無法寫出檔案問題

在red hat系列的linux中selinux對哪些daemon可以進行怎麼樣的操作是有限制的,mysql的select into outfile的命令是mysql的daemon來負責寫文件操作的。寫檔之前當然要具有寫檔的許可權。而selinux對這個許可權做了限制。如果selinux是關閉的吧,這個命令執行是沒有問題的
mysql> select user from user into outfile ‘/home/test.txt’;
Query OK, 2 rows affected (0.02 sec)
當時selinux開啟時
selinux對mysql的守護進程mysqld進行了限制。
mysql> select user from user into outfile ‘/home/test.txt’;
ERROR 1 (HY000): Can’t create/write to file ‘/home/test.txt’ (Errcode: 13)
出現了沒有許可權寫的error。
解決方法,可以關閉selinux。
可以在/etc/selinux中找到config
root用戶,
shell>vi /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing – SELinux security policy is enforced.
# permissive – SELinux prints warnings instead of enforcing.
# disabled – SELinux is fully disabled.
SELINUX=enforcing

修改SELINUX=disabled關閉selinux就可以了,這個問題就可以解決了。
不過全部關閉SELINUX有帶來一些安全問題。
當然也可以,單獨給mysql的守護進程許可權,
shell>getsebool -a可以查看當前的對系統一系列守護進程的許可權情況。

lpd_disable_trans –> off
mail_read_content –> off
mailman_mail_disable_trans –> off
mdadm_disable_trans –> off
mozilla_read_content –> off
mysqld_disable_trans –> off
nagios_disable_trans –> off
named_disable_trans –> off
named_write_master_zones –> off
nfs_export_all_ro –> on
nfs_export_all_rw –> on
nfsd_disable_trans –> off
nmbd_disable_trans –> off
nrpe_disable_trans –> off

shell>setsebool -P mysqld_disable_trans=1
開啟對mysql守護進程的許可權,這樣
mysql> select user from user into outfile ‘/home/test.txt’;
寫入到自訂的目錄就沒有問題了。
-P表示 是永久性設置,否則重啟之後又恢復預設值。
getsebool setsebool命令在root用戶下有許可權。

除了對selinux的許可權,當然首先要保證該目錄擁有讀寫許可權。
在ubuntu下 ,可以對AppArmor(/etc/apparmor.d/usr.sbin.mysqld) 修改,類似selinux。
添加/etc/squid/lists/eighties.txt w,類似。

延伸閱讀:http://www.fromdual.com/mysql-and-secure-linux-selinux

廣告

VNC 工作法

[VNC軟體]:
server: tigervnc
client: realvnc viewer

[步驟]:
# 連進server開啟VNC server
ssh (user)@<remote_host_ip>
create vnc server: vncserver -geometry 1600×900
# 查看已開server的列表
list vnc server: vncserver -list
# 若要刪掉server,冒號後為port號碼
kill vnc server: vncserver -kill :1

分享檔案: scp (user)@<remote_host_ip> filename
查看執行中的程序: ps aux | grep <service_name>

[Scala] 學習筆記

1. 函數的用法:

1. 一般函數:。def sum1() = 1 + 1   // sum1 宣告成無參數函數,等同 def sum1() = { 1 + 1 }
呼叫:

a. sum1   // 印出2,呼叫無參數函數不必加()
b. val val1 = sum1 _ // 指派函數給 val1
val1()    // 印出2

1-1。def sum2(n: Int) = n + 1 // sum2 宣告成帶參數函數,等同 def sum2(n: Int) = { n + 1 }
呼叫:

a. sum2(1)   // 印出2
b. val val2 = sum2 _ //指派函數給 val2,等同 val val2 = sum2(_: Int)
val2(1)    // 印出2

2. 一般函數回傳函數。def sum3() = (n: Int) => n + 1 // sum3 宣告成無參數函數回傳匿名函數,等同def sum3() = { (n: Int) => n + 1 }
呼叫:

a. sum3 // 印出 Int => Int = <function0>,呼叫無參數函數不必加()
b. val val3 = sum3 // 注意:指派的是 sum3() 回傳的匿名函數
val3(1) // 印出2

2-1。val sum4 = (n: Int) => n + 1 // 直接宣告 sum4 不變量指向匿名函數
呼叫:sum4(1) // 印出2,等同上面的2.b
2-3。def sum5(m: Int) = { (n: Int) => m + n } // sum5 宣告成帶參數函數回傳匿名函數,此處不可省略{}
呼叫:

a. sum5(2) // 印出 Int => Int = <function0>
b. val val5 = sum5(2) // 注意:指派的是 sum5(2) 回傳的匿名函數,帶閉包 m=2
val5(1) // 印出3

3. 將Callback當參數的函數。def sum6(fun: (Int) => Int) = fun(2) + 1
呼叫:

a. sum6((n: Int) => n + 1) // 印出4,等同sum6({(n: Int) => n + 1}),只傳一個Callback參數可省略小括號,故也等同sum6{(n: Int) => n + 1}
b. sum6((n: Int) => n *2) // 印出5

 

參考文章:

1. http://zh.scala-tour.com
2. http://www.codedata.com.tw/java/scala-tutorial-easy-statically-typed-lang/
3. http://twitter.github.io/scala_school/zh_cn/
4. https://github.com/chikei/scala.github.com/blob/zh_TW/zh/tutorials/scala-for-java-programmers.md
5. http://hatemegalaxy.blogspot.tw/2014/09/play-framework-useful-tutorials-for.html
6. http://www.scala-lang.org/api/current/
7. https://www.playframework.com/documentation/2.3.x/api/scala/index.html

Play framework 安裝筆記 (with Scala)

1. 安裝 Java
2. 安裝 Activator
3. export PATH=$JAVA_HOME/bin:$ACTIVATOR_HOME:$PATH
4. 建立 Play template

a. activator new my-first-app play-scala
b. cd my-first-app
c. activator

5. 建立 Play 專案 for Eclipse

a. [my-first-app] $ eclipse with-source=true

6. 打開 Eclipse 匯入專案

a. File/Import/General/Existing project… 匯入專案
b. 下載 Scala plugin:
Help/Install New Software… 添加 Scala IDE 的URL: http://download.scala-ide.org/sdk/e38/scala210/stable/site,勾選並下載:

。Scala IDE for Eclipse
。Scala IDE plugins (incubation) 的 Play2 support in Scala IDE

c. 切換 Perspective 到 Scala
d. Done!

MySQL 預設行為

MySQL 預設行為: completion_type=0 (or NO_CHAIN) & Row Exclusive (X) Lock
1. COMMIT 和 ROLLBACK 不被附加在原本 SQL 頭尾
2. BEGIN (or START TRANSACTION): 若沒 COMMIT 又再下一次 BEGIN,則前一次 TRX 會被 AUTOCOMMIT
3. BEGIN 後下 UPDATE 的時候,此時若別人 SELECT,別人不會被 LOCK,會顯示舊的值;若別人是下 UPDATE 影響到該 row,別人會被 LOCK

— 檢查哪個 TRX 正在執行或被 Block
SET @threshold = 0;

SELECT p.user,
LEFT(p.HOST, LOCATE(‘:’, p.HOST) – 1) host, p.id,
TIMESTAMPDIFF(SECOND, t.TRX_STARTED, NOW()) duration,
COUNT(DISTINCT ot.REQUESTING_TRX_ID) waiting
FROM INFORMATION_SCHEMA.INNODB_TRX t
JOIN INFORMATION_SCHEMA.PROCESSLIST p
ON ( p.ID = t.TRX_MYSQL_THREAD_ID )
LEFT JOIN INFORMATION_SCHEMA.INNODB_LOCK_WAITS ot
ON ( ot.BLOCKING_TRX_ID = t.TRX_id )
WHERE t.TRX_STARTED + INTERVAL @threshold SECOND <= NOW()
GROUP BY LEFT(p.HOST, LOCATE(‘:’, p.HOST) – 1), p.id, duration
HAVING duration >= @threshold OR waiting > 0;

資料來源:http://mysqlblog.fivefarmers.com/2012/08/28/identifying-and-killing-blocking-transactions-in-innodb/

Fedora上的網路設定

基本查詢指令

查詢網路卡資訊:ifconfig -a
查詢防火牆資訊:iptables -L -n
查詢路由:route -n


無線網路

搜尋無線網路:
iwlist ethx scan
ethx 就是網路卡代號
假設我的無限網路是使用eth1:iwlist eth1 scan

開始編寫我的設定檔
vi /etc/sysconfig/network-scripts/ifcfg-eth1

如果是使用dhcp
那ifcfg-eth1裡面就需要有
TYPE=Wireless
DEVICE=eth1
BOOTPROTO=dhcp
ONBOOT=no <–是否一開機就連線
ESSID=xxxx <–無線網路的名稱

如果是使用static
那ifcfg-eth1裡面的選項就變成
TYPE=Wireless
DEVICE=eth1
BOOTPROTO=static
NETMASK=255.255.255.0 <–子網路遮罩
IPADDR=192.168.1.13 <–ip位址
NETWORK=192.168.1.0 <–網域
BROADCAST=192.168.1.255 <–廣播位址
GATEWAY=192.168.22.10 <–預設路由
ONBOOT=no
ESSID=xxxx
KEY=xxxxxxxx<–密碼


有線網路

編寫設定檔
vi /etc/sysconfig/network-scripts/ifcfg-eth0

如果是使用dhcp
ifcfg-eth0裡面的選項就會有
TYPE=Ethernet
DEVICE=eth0
HWADDR=00:40:D0:13:c5:d8 <–網路卡位址
BOOTPROTO=dhcp
NBOOT=no
USERCTL=no <–是否允許使用者(非管理者)控制

如果是使用static
TYPE=Ethernet
DEVICE=eth0
BOOTPROTO=static
NETMASK=255.255.255.0 <–子網路遮罩
IPADDR=192.168.1.13 <—ip位址
NETWORK=192.168.1.0 <–網域
BROADCAST=192.168.1.255 <–廣播位址
GATEWAY=192.168.22.10 <–使用撥接上網的就不要設定gateway
ONBOOT=no
ESSID=xxxx
KEY=xxxxxxxx <–密碼
其實有線和無線網路差不多
只要TYPE寫清楚是wireless或是Ethernet就ok了
另外設定好後

啟動網路
ifup ethx <–看要啟動哪一種網路

關閉網路
ifdown ethx