
以下のスクリプトを参照してください。
#!/usr/bin/bash
#scirpt to connect with db
master_db_user=''
master_db_passwd=''
master_db_port='3306'
master_db_host=''
master_db_name='uppcldashboard'
Now=$(date +"%d-%m-%Y")
date=$(date +"%F")
#Preparing script
#SQL_Query='select * from test_table;'
#MySql Command to connect to a database
#mysql -u$master_db_user -p$master_db_passwd -D$master_db_name -e "select * from uppcl_amount_details into outfile '/created_files/uppcl.csv' fields terminated by ',' lines terminated by '\n';"
mysql -u$master_db_user -p$master_db_passwd -D$master_db_name -e "select *,IFNULL(ref_4,0),IFNULL(ref_3,0),IFNULL(ref_7,0),IFNULL(ref_8,0),date_format(posting_date,'%Y-%m-%d') from uppcl_amount_details where posting_date>=CURDATE() into outfile '/created_files/uppcl.csv' fields terminated by ',' lines terminated by '\n';"
mv /created_files/uppcl.csv /created_files/offline_collection$Now.csv
sed -i "1i id","Cashier_id","Cheque_no","collection_amount","collection_type","Posting_date","Discom","Division_Code","Division_Name","Head_cashier_id","ref_3","ref_4","ref_5","ref_6","ref_7","ref_8","Tran_Date","Status","Posting_Updated_Date" /created_files/offline_collection$Now.csv
echo "End of the Script"
さて、このスクリプトは基本的に、現在の日付の MySQL サーバーからデータを取得するので、このスクリプトをスケジュールして、現在の日付のデータを取得するようにする必要があります。ただし、データは継続的に取得されるため、午前 2 時にスケジュールすることはできません。午前 2 時まで MySQL サーバーにデータが入力されるためです。そこで、2 つの回避策を考えました。1 つは、前の日付のデータを取得することです。たとえば、今日が 2020 年 4 月 16 日の場合、スクリプトが今日午前 2 時に実行されると、2020 年 4 月 15 日のデータが取得されます。
または
私はこのスクリプトを、1 日の終わり、たとえば午後 11 時 58 分などにスケジュールします。
あなたの意見では、どの方法が最善の方法でしょうか。また、午後 11 時 58 分の cron ジョブを教えていただけますか。
以前の日付のデータを取得することを検討している場合は、それを取得するための変更を加える必要があります。
ありがとう、敬具、サガール・マンダル
答え1
あなたの場合、クエリがいつ開始されたかに関係なく、1 日のレコードを取得するようにクエリを制限します。そうすれば、午前 2 時またはいつでも開始できます。そうすれば、実行されるはずだった時間に何か問題が発生した場合、後でスクリプトを手動で実行できます。
スクリプト内の where 条件を次のように変更します。
where DATE(posting_date) = DATE(DATE_ADD(CURDATE(), INTERVAL -1 DAY))
そうすれば、昨日の日付のレコードのみが取得されます。
bash 変数を使用して実行する場合は、MySql に適した形式で現在の日付を取得します。
date=$(date --rfc-3339=date)
の出力は、$date
MySql で認識できる形式になります。
2020-04-16
次に、次のような where 条件を作成します。
where DATE(posting_date) = DATE(DATE_ADD('$date', INTERVAL -1 DAY))
を変更するとinterval -1 day
、任意の日付のデータを取得できます。
そしてもう1つ。スクリプトからMySqlにユーザー名とパスワードを提供しないでください。そうすると、パスワードが明らかになり、遅かれ早かれ後悔することになります。mysql_config_editor
(参考:) を使用して資格情報を保存し、後でスクリプト内で使用できるようにします。