如何恢复始终作为列生成的mysql备份?

时间:2017-09-09 06:35:12

标签: mysql sql database

CREATE TABLE `revenue_daily` ( `wallet` varbinary(100) NOT NULL DEFAULT '0',
`tc_access` varbinary(100) NOT NULL DEFAULT '0',
`tc_short` varbinary(100) NOT NULL DEFAULT '0',
`total_toll_collection` varbinary(100) GENERATED ALWAYS AS (`wallet` + `tc_access`) VIRTUAL NOT NULL,
`cash_collection` varbinary(100) GENERATED ALWAYS AS (`total_toll_collection` - `tc_short`) VIRTUAL NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=ascii;

该表已生成column.I使用数据备份数据库结构,当我恢复相同的.sql文件时,则会发生错误。 错误是: -

ERROR 3105 (HY000) at line 262: The value specified for generated column 'total_toll_collection' in table 'revenue_daily' is not allowed. 

我使用的是mysql版本: -

sunilp@sunilp ~> mysql --version
mysql: [Warning] World-writable config file '/etc/mysql/mysql.conf.d mysqld.cnf' is ignored.
mysql  Ver 14.14 Distrib 5.7.18, for Linux (x86_64) using  EditLine wrapper

2 个答案:

答案 0 :(得分:1)

当使用来自 MariaDB 的 mysqldump 和虚拟生成列时,这是一个问题。 MariaDB 的 mysqldump 显然转储了生成的值,但 MySQL 只接受 DEFAULT 作为虚拟生成列的值。

看来您需要使用 MySQL 的 mysqldump 来正确转储和恢复 MySQL 服务器上的虚拟生成列。

也报告了错误 here


我的解决方法是替换转储中的虚拟列:

sed -i 's/GENERATED ALWAYS AS .* VIRTUAL/NOT NULL/' mydump.sql

然后恢复转储,然后再次删除/添加生成的列:

mysql -e "ALTER TABLE foo DROP COLUMN bar;\
ALTER TABLE foo ADD COLUMN bar VARCHAR(255) AS ...;"

我也发布了这个答案 here

答案 1 :(得分:0)

我在使用 adminer (https://www.adminer.org/) 从 mariadb 转储它时遇到了同样的问题

就我而言,我使用 phpmyadmin 进行转储解决了这个问题。它对我有用。

我不知道原因,但管理员转储了生成的值列。不应该,因为应该在插入行时生成该值。

我没有尝试从命令行使用 mysqldump 时会发生什么...