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

问题描述 投票:0回答:4
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;

该表已生成列。我用数据备份了数据库结构,当我恢复相同的 .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
mysql sql database
4个回答
9
投票

将 MariaDB 中的 mysqldump 与虚拟生成的列一起使用时,这是一个问题。 MariaDB 的 mysqldump 显然会转储生成的值,但 MySQL 只接受

DEFAULT
作为虚拟生成列的值。

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

这个错误也被报告了这里


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

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


0
投票

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

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

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

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


0
投票

我们设法将主要的

mysqldump
命令分成步骤来做到这一点:

  • 删除所有表(如果您尚未在原始

    --add-drop-database
    命令中使用
    mysqldump
    参数)

  • 将参数

    --ignore-table=your_schema.your_table
    添加到原始
    mysqldump
    命令

  • 运行此命令后,使用新的

    mysqldump
    命令仅创建表结构:

    mysqldump --no-data ... your_schema your_table
    
  • 使用

    mysql
    命令在 your_table 上运行正确的
    ALTER
    (您想要更改基本表的类型),例如:

    mysql ... -D your_schema -e "ALTER TABLE your_table MODIFY COLUMN your_column1 boolean default null, MODIFY COLUMN your_column2 boolean default null;"
    
  • 最后,使用

    mysqldump
    命令仅填充表格(而不创建表格):

    mysqldump --no-create-info ... -e your_schema your_table
    

希望对你有帮助,祝你有美好的一天!


0
投票

我不太喜欢 sed 解决方案,所以我是这样做的:

  1. 以常规非特权用户身份从源 MySQL 8.0(不是 MariaDB)克隆并编译。确保您的主目录中有一个 tmp 目录。
    git clone -b 8.0 https://github.com/mysql/mysql-server ~/tmp/mysql-server
    cd ~/tmp/mysql-server
    mkdir bld && cd bld
    cmake -DCMAKE_INSTALL_PREFIX=~/mysql-vanilla -DDOWNLOAD_BOOST=1 -DWITH_BOOST=~/tmp/boost ../
    make -j 8
    make install
  1. 现在,您有 ~/vanilla-mysql/bin/mysqldump 可以用来转储 MariaDB 数据库:
~/vanilla-mysql/bin/mysqldump \
-S /var/run/mysqld/mysqld.sock \
-uuser -ppassword --triggers --events --routines \
database_name > dump.sql

转储应恢复到 Aurora / RDS 等。

© www.soinside.com 2019 - 2024. All rights reserved.