Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 用当前时间戳重命名数据库的bash脚本_Mysql - Fatal编程技术网

Mysql 用当前时间戳重命名数据库的bash脚本

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 ${

我想要一个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} -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客户端。