一般情况下不会特意到linux系统上去使用mysql, 毕竟没有类似MysqlFront这样现成的操作工具。但是产品的线上服务器是linux服务器,没办法,只能硬着头皮码shell语句来操作了。
首先要明确一点,拉sql的sql语句和在后台java内部调用sql语句的目标不同,所以设计方法也不同:拉sql注重开发sql语句效率,而运行效率不必过于在意,所以甚至可以一张表可以用几个sql语句来合成
通用语句如下:
mysql -u biadmin -h lbw-52xfj.mysql.rds.aliyuncs.com -p -e "你需要的sql语句" > 文件输出位置
-u 是mysql用户名, -h 是主机地址(如果是在本机上操作可以写 "localhost", 远程的话好像就只能写ip地址或者域名了), -e 不在mysql提示符环境下运行sql(当然你得每次输入密码!)
有几点是需要注意的:
1. " "内的sql语句不可以带"`",就是esc键与tab键之间的那个键,我试图把它加进去过,结果就是执行语句后程序一直suspend在那里, 如果sql语句字段里有特殊意义的字符比如 "sum",也只好换个命名方式了~~
2. sql语句中不可以存在回车键盘,否则系统会以回车键之前的语句作为 输入语句,这点非常坑爹,每次写好一个sql语句还要一行一行把它重新排列一次。目前没什么好的方法,我自己是用java把sql语句的 “ ” 替换成了空格~~,代码如下:
1 package utils; 2 import java.io.BufferedReader; 3 import java.io.BufferedWriter; 4 import java.io.File; 5 import java.io.FileReader; 6 import java.io.FileWriter; 7 import java.io.Reader; 8 import java.io.Writer; 9 10 public class SqlExport { 11 12 /** 13 * @Description 以" "拼接源文件各行并输出至目标文件 14 * @param srcAddr 源文件地址 15 * @param destAddr 目标文件地址 16 */ 17 public void rmvEnter(String srcAddr, String destAddr) { 18 File srcFile = new File(srcAddr); 19 File destFile = new File(destAddr); 20 21 FileReader sr = null; 22 FileWriter dw = null; 23 BufferedReader br = null; 24 BufferedWriter bw = null; 25 26 try { 27 if (!srcFile.exists()) { 28 srcFile.createNewFile(); 29 } 30 if (!destFile.exists()) { 31 destFile.createNewFile(); 32 } 33 sr = new FileReader(srcFile); 34 dw = new FileWriter(destFile); 35 br = new BufferedReader(sr); 36 bw = new BufferedWriter(dw); 37 38 String str = null; 39 /* 读一行,写一行 */ 40 while((str = br.readLine()) != null) { 41 str = " " + str; 42 bw.write(str); 43 } 44 bw.flush(); 45 } catch (Exception e) { 46 e.printStackTrace(); 47 } finally { 48 closeWriter(bw); 49 closeReader(br); 50 closeWriter(dw); 51 closeReader(sr); 52 } 53 54 } 55 56 private void closeReader(Reader rd) { 57 if (null != rd) { 58 try { 59 rd.close(); 60 } catch(Exception e) { 61 e.printStackTrace(); 62 } 63 } 64 } 65 66 private void closeWriter(Writer wr) { 67 if (null != wr) { 68 try { 69 wr.close(); 70 } catch(Exception e) { 71 e.printStackTrace(); 72 } 73 } 74 } 75 76 77 public static void main(String[] args) { 78 String srcAddr = "C:/Users/pc/Desktop/sql语句库/推荐人推广明细.sql"; 79 String destAddr = "C:/Users/pc/Desktop/sql语句库/dest.sql"; 80 81 new SqlExport().rmvEnter(srcAddr, destAddr); 82 83 } 84 85 }
3. 其中"文件输出位置"可以是不存在的文件,该语句会自动为你创建并注入查询结果,目前只试过CSV文件,xls格式文件还没有试过, 如果想把输出的CSV文件转为xls的话,先使用excel的自文本功能格式化CSV文件,之后将文件另存为excel格式。
4. " "内的sql语句要在最开始加上database选择语句, 否则执行shell命令后会报错: no database selected!