
Пожалуйста, ознакомьтесь со сценарием ниже.
#!/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 часа ночи, потому что он будет получать данные, введенные на сервер MySQL до 2 часов ночи. Поэтому я придумал два решения: либо я получаю данные за предыдущую дату, например, сегодня 16/04/2020, так что если скрипт запустится сегодня в 2 часа ночи, он извлечет данные за 15/04/2020.
или
Я планирую этот сценарий на конец дня, например, на 23:58 или что-то в этом роде.
По вашему мнению, какой способ лучше? Можете также подсказать мне задание cron на 23:58?
если я рассматриваю возможность получения данных за предыдущую дату, то для ее получения необходимо внести изменения.
Спасибо и с уважением, Сагар Мандал
решение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
, вы сможете получить данные за любой день.
И еще одно. Не передавайте имена пользователей и пароли в MySql из скриптов. Так пароли будут раскрыты, и рано или поздно вы об этом пожалеете. Используйте mysql_config_editor
(https://dev.mysql.com/doc/refman/8.0/en/mysql-config-editor.html) для хранения учетных данных и их последующего использования в скрипте, подобном вашему.