如何以json格式导出具有从所述日期到所述日期的对话表的所有数据库

时间:2017-09-01 21:57:50

标签: mysql json bash

以下是知识:

DBEngine:MYSQL
壳牌:/斌/庆典
开始日期
结束日期

这就是我遇到的问题:
如何查询所有数据库并将其名称放在数组中
如何从开始日期到结束日期查询对话表
如何以json格式转储该数据

这是我到目前为止所做的:

#!/bin/bash  

data_base="*"  
db_user="superfly"  
db_pass="superflypassword"  
start_date=""  
end_date=""  
wdir="/home/superfly"  

cd $wdir  
mysqldump -hlocalhost -u${db_user} -p${db_pass} $data_base conversations > ${data_base}_conversations.sql

2 个答案:

答案 0 :(得分:0)

您可以使用bash脚本获取数据库名称并在其上循环:

mysql -BNe "SELECT TABLE_SCHEMA FROM INFORMATION_SCHEMA.TABLES 
  WHERE TABLE_NAME='conversations'" | while read schema
do
  ...
done

Mysqldump不以JSON格式输出。它输出SQL脚本或带有选项--tab的CSV文件。

mysql客户端也不输出JSON格式。

但您可以使用MySQL 5.7 JSON函数从列构建JSON文档:

mysql -BN --database=$schema --execute="SELECT 
  JSON_OBJECT('col1', col1, 'col2', col2, 'col3', col3, 'col4', col4) 
  FROM conversations WHERE date_col BETWEEN '<start-date>' AND '<end-date>'"

这至少会将每一行输出为单独的JSON文档。要使整个集合成为一个长JSON文档,您必须在开头和结尾手动添加一些JSON语法,并在行之间插入逗号。

另一个选择是MySQL Shell。这是一个客户端工具,是一个相对较新的产品。它是免费的,但需要单独安装。有关安装帮助,请参阅https://dev.mysql.com/doc/refman/5.7/en/document-store-shell-install.html

您可以这样使用它:

mysqlsh --sql --database=$schema --execute="show tables" --json

在此示例中,我只运行show tables但您可以运行任何SQL查询。在此处阅读有关MySQL Shell的更多信息:https://dev.mysql.com/doc/refman/5.7/en/mysql-shell.html

答案 1 :(得分:0)

Bill Karwin's answer是对的。我尽我所能并创建了以下脚本:

#/bin/bash

days="8"
group_name="C4"
wdir="/home/superfly/conversations"
backup_dir="${wdir}/.backups"
db_list="database_list.txt"
table="conversations"
#--
backup_date="`date +"%m-%d-%y"`"
tarball_file="${group_name}__${backup_date}"
email1="one@gmail.com"
email2="two@gmail.com"
email3="three@gmail.com"

#-- clean up any old files that may exist
cd $backup_dir && rm -rf ${tarball_file}* ${db_list} *.json;

#-- fetch database list minus the default system database names
mysql --login-path=master --skip-column-names -e "SELECT schema_name AS DatabaseList \
    FROM information_schema.schemata WHERE schema_name NOT IN ('mysql', 'Database', \
    'information_schema', 'performance_schema', 'sys', 'schema_name')" > $db_list

#-- fetch the last 8 days of the conversations table in json format
for database in `cat $db_list`;
do
    mysql --login-path=master -BN --database=${database} --execute="SELECT \
    JSON_OBJECT('id', id, 'sender_id', sender_id, 'recipient_id', recipient_id, \
    'timestamp', timestamp, 'content', content, 'quick_reply', quick_reply, 'type', \
    type, 'seq', seq, 'meta', meta) FROM $table WHERE timestamp >= DATE_SUB(NOW(), \
    INTERVAL ${days} day)" > ${database}.json;
done

#-- remove empty jason files - compress populated json files
find $backup_dir -size 0 -delete;
tar czf ${tarball_file}.tar.gz *.json;
rm -rf *.json $db_list;

#-- email compressed file
echo "Conversations Logs From The Last 8 days" | mutt -a ${tarball_file}.tar.gz \
    -s"Conversations Logs" -- $email1 $email2 $email3
exit 0;