我有一个名为 vitalstatistix 的 MySQL 5.5 事务数据库,我希望每月存档。该数据库由一个名为 asterisk_event 的巨大表和较小的查找表组成。
asterisk_event 表有一列名为日期时间。
1.我想提取该列的year_month部分:
SELECT DISTINCT EXTRACT(YEAR_MONTH FROM datetime) AS DATEPART
FROM asterisk_event
WHERE `datetime` <= NOW() - INTERVAL 6 MONTH
+----------+
| DATEPART |
+----------+
| 201307 |
| 201308 |
| 201309 |
| 201310 |
| 201311 |
| 201312 |
| 201401 |
| 201402 |
| 201403 |
| 201404 |
| 201405 |
| 201406 |
| 201407 |
| 201408 |
+----------+
20 rows in set (1.31 sec)
- 并且,对于上面返回的每个 DATEPART,创建一个名为 vitalstatistix_'datepart' 的数据库,例如,vitalstatistix_201307
每个创建的存档数据库都将包含一个月的数据。
我需要创建一个 bash 脚本和/或 SQL (MySQL) 存储过程或语句来补充它。
这就是我现在所拥有的:
#!/bin/bash
MUSER="root"
MPASS="password"
MHOST="localhost"
MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"
DB="vitalstatistix"
for db in ${DB}
do
# Step 2: Identify the months that need archiving
echo "$MYSQL -u$MUSER $db -Bse 'SELECTING .... FROM asterisk_event'"
DATEPARTS="$($MYSQL -u$MUSER -p$MPASS $db -Bse 'SELECT DISTINCT EXTRACT(YEAR_MONTH FROM datetime) AS DATEPART FROM asterisk_event WHERE `datetime` <= NOW() - INTERVAL 6 MONTH')"
echo "[START ARCHIVING]"
echo "Database: "$db
echo ${DATEPARTS}
# Step 3: Create archive databases
for DATEPART in ${DATEPARTS}
do
echo $DATEPART
#ENTER LINES OF CODE HERE
done
echo "[END ARCHIVING]"
done
最佳答案
类似的事情...
MYSQL="mysql -uuser -ppassword database -BNe"
$MYSQL "SELECT DISTINCT EXTRACT(YEAR_MONTH FROM datetime) AS DATEPART
FROM asterisk_event WHERE `datetime` <= NOW() - INTERVAL 6 MONTH"
| while read date; do
$MYSQL "CREATE TABLE vitalstatistix_$date SELECT * FROM asterisk_event
WHERE datetime LIKE '$date%'"
done
一个更简单的事情是使用 mysql trigger
插入时,要将数据插入到第二个表中,并在每个月初将此表重命名为 vitalstatistix_<date>
并开始一个新的。
关于mysql - 使用 Bash 脚本进行数据库归档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28577615/