shell下执行mysql查询导出到文件,简单高效

最近在做mysql多表查询生成报表之类的事情,表数据又比较大,大到一个表有几千万行两三个G大,小到几百万行一两个G,而且还要联合查询,又是group,又是子查询,索引都用不上,这样查几个小时不一定出来结果。 无意中试了下shell中执行sql并且导出到文件,平时在Navicat这种图形客户端半天都没结果的sql,在shell小到几分钟,大到个把小时,都不会等太久,而且导出的文件可以直接以TXT导入到数据库或者全部复制,粘贴到Excel中。 刚开始想着进入mysql-client执行查询然后导出到文件,结果失败了,提示没有权限创建文件,提供的导出文件路径只能在mysql安装目录下,其他位置没有权限新建文件,后来了解到用 echo + 管道符就好了,这种方法在root下面执行,不存在权限问题。 用法如下: echo "sql语句" | mysql -u用户名 -p密码 数据库 > /任意位置/xxx.txt 这里文件后缀TXT就好了,因为导出的格式是Navicat这种导出为TXT的格式,每列用TAB制表符隔开这样。 这样虽然方便,但是sql很长的时候就不那么方便了,写到shell里面再合适不过了,完整的shell示例如下: 随便建个shell文件吧,比如 export.sh #!/bin/bash MYSQL=/usr/bin/mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_USER=root DB_PASSWORD=root DB_DATABASE=test OUT_FILE=/www/test.txt SQL="select * from mysql" echo ${SQL} | ${MYSQL} -h${DB_HOST} -P${DB_PORT} -u${DB_USER} -p${DB_PASSWORD} ${DB_DATABASE} > ${OUT_FILE} 给sh文件执行权限 chmod +x export.sh 执行sh文件,开始导出了 ./export.sh 写的比较简单,没有做执行结果判断。

MySQL每日分表定时备份shell

最近有个需求:项目是21G的mysql数据库,需要做每日备份归档,本来考虑做增量备份的,从时间安排考虑,还是先做个每日全量备份吧。 思路是先连接数据库,切换到要备份的库,然后取出所有表名,接下来遍历每张表,挨个导出为 .sql 文件,放到日期为命名的文件夹里,最后压缩为 .tar.gz 压缩包。 使用的是crontab做每日定时任务。 #!/bin/sh # 临时备份路径(未压缩的文件) OUT_DIR=/www/backup/tmp # 压缩后的备份存放路径 TAR_DIR=/www/backup/data # 数据库信息 URL=127.0.0.1 PORT=3306 USERNAME=root PASSWORD=root DBNAME=your_dbname # 当前系统时间 DATE=`date +%Y-%m-%d` # 指定命令所用的全路径 MYSQL=/usr/bin/mysql MYSQLDUMP=/usr/bin/mysqldump MYSQLADMIN=/usr/bin/mysqladmin # 日志文件 logfile=/www/backup/data.txt [ -d ${OUT_DIR} ] || mkdir -p ${OUT_DIR} [ -d ${TAR_DIR} ] || mkdir -p ${TAR_DIR} # 最终保存的数据库备份文件 TAR_BAK="your_dbname_$DATE.tar.gz" cd ${OUT_DIR} rm -rf ${OUT_DIR}/* echo "${DBNAME} backup start - ${DATE}\n" >>${logfile} # ${MYSQL} -h $URL:$PORT -u $USERNAME -p $PASSWORD -d $DBNAME -o $OUT_DIR/`$DATE +%Y-%m-%d` TABLE=$(${MYSQL} -h${URL} -P${PORT} -u${USERNAME} -p${PASSWORD} -e "use ${DBNAME};show tables;"|sed '1d') #依次列出需要备份的表的名字 for tname in ${TABLE} do #echo "${DBNAME}_${tname}_${DATE}" # 创建备份表的目录 [ -d ${OUT_DIR}/${DATE} ] || mkdir ${OUT_DIR}/${DATE} ${MYSQLDUMP} --set-gtid-purged=off --single-transaction --column-statistics=0 -h${URL} -P${PORT} -u${USERNAME} -p${PASSWORD} ${DBNAME} ${tname} >${OUT_DIR}/${DATE}/${tname}.