Mysql 用当前时间戳重命名数据库的bash脚本
我想要一个bash脚本,用时间戳后缀重命名MySQL数据库Mysql 用当前时间戳重命名数据库的bash脚本,mysql,Mysql,我想要一个bash脚本,用时间戳后缀重命名MySQL数据库 DB=database DATE=$(date +%Y%m%d_%H%M%S) ( echo "CREATE DATABASE $DB_$DATE;" echo "USE $DB;" echo 'SHOW TABLES;' | while read TABLE; do echo "RENAME TABLE $DB.$TABLE TO $DB_$DATE.$TABLE;" done ) | mysql ${
DB=database
DATE=$(date +%Y%m%d_%H%M%S)
(
echo "CREATE DATABASE $DB_$DATE;"
echo "USE $DB;"
echo 'SHOW TABLES;' | while read TABLE; do
echo "RENAME TABLE $DB.$TABLE TO $DB_$DATE.$TABLE;"
done
) | mysql ${DB} -N
exit 0;
错误:
”重命名表数据库。显示表;到数据库_20191205_121556.SHOW TABLES;;'代码>
第3行的错误1064(42000):您的SQL语法有错误;检查与您的MariaDB服务器版本对应的手册,以了解第1行“TABLES”附近使用的正确语法
echo 'SHOW TABLES;' | while read TABLE; do
这不会在表列表上循环,而是在单个字符串“showtables”上循环
您可能想要:
mysql ${DB} -Nse "SHOW TABLES" | while read TABLE; do
请回复您的评论: 考虑以下两个命令:
ls | while read filename ; do echo $filename ; done
echo ls | while read filename ; do echo $filename ; done
试试这两个命令。不是在脚本中,只是在shell中。输出是什么
仅回显包含命令的字符串不会运行该命令
仅将字符串读入您命名的变量$TABLE
,并不意味着它包含表名
好的,我正在尝试您的脚本,但管道连接到
cat
而不是mysql
:
DB=database
DATE=$(date +%Y%m%d_%H%M%S)
(
echo "CREATE DATABASE $DB_$DATE;"
echo "USE $DB;"
echo 'SHOW TABLES;' | while read TABLE; do
echo "RENAME TABLE $DB.$TABLE TO $DB_$DATE.$TABLE;"
done
) | cat
exit 0;
这样我们就可以看到输出:
CREATE DATABASE 20191205_174532;
USE database;
RENAME TABLE database.SHOW TABLES; TO 20191205_174532.SHOW TABLES;;
前两个echo语句为CREATE
和USE
输出合法的SQL语句。那很好
但是虽然循环没有读取表名,但它正在读取一个字符串:“showtables”并假设它是一个表名。但它不是一个表名,它只是一个字符串,恰好是字面上的“showtables”。它不是运行“showtables”的输出,而是字符串本身
我不知道该怎么解释
哦,第二个问题与循环无关
在shell中,\uuu
是变量名中的有效字符。因此,$DB
不同于$DB
。如果在带有字符的字符串中使用变量名,则应该对其进行分隔
echo "CREATE DATABASE ${DB}_${DATE};"
按照您编写该命令的方式,它尝试替换不存在的变量$DB_uu
的值。前面的所有命令都正常工作。当客户端已经被插入到块中时,为什么需要与客户端一起运行该特定命令?对于您的编辑,我理解从bash运行时的情况,所以我想我的问题是为什么创建数据库和使用工作?是因为我们没有使用他们的输出吗?在这些实例中,运行命令到已经初始化的mysql客户端提示符(而不是bash)中。我得到它,我只是想它会像其他的那样运行cmds,但是输出随后被管道传送到并读取
。谢谢你,恕我直言,我真的不明白你会怎么想。您需要将字符串导入中,然后读取时将其导入。MySQL是不可能进入这个管道的,因为我认为这个例子中的echo
是进入MySQL客户端的。“代码>回声”和“使用”的创建数据库
和使用
实际上运行命令。我想echo显示表代码>将运行显示表将>编码到mysql客户端。