背景:使用了nocobase开源平台时,使用备份功能时发现报错,报错日志包含:
mysqldump: Error: 'Expression #6 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'information_schema.FILES.EXTRA' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by' when trying to dump tablespaces
mysqldump: Got errno 28 on write
于是想当然的认为数据库的sql_mode设置有问题,包含了only_full_group_by。 排查: 1、确认数据库sql_mode设置未包含only_full_group_by 2、与开发排查,或得执行备份的SQL:
mysqldump -u xxx -h -P xxx --hex-blob --compatible=ansi --replace --single-transaction --column-statistics=0 --skip-lock-tables --set-gtid-purged=OFF --routines --triggers --protocol=tcp --result-file=/data/backup/
使用该命令进行备份时发现确实有上面报错,但是该报错类提示类报错,不影响备份执行,仍可正常生成备份文件
3、通过general_log分析,发现备份时会进行SET @@SQL_MODE='ANSI'设置,查看到备份命令中包含--compatible=ansi参数,于是进一步确认是否该参数导致
 4、去掉该参数后,备份无报错,对不包含该参数和包含该参数的两个备份文件的sql_mode设置对比二次确认该参数在备份时会进行SET @@SQL_MODE='ANSI'设置
4、去掉该参数后,备份无报错,对不包含该参数和包含该参数的两个备份文件的sql_mode设置对比二次确认该参数在备份时会进行SET @@SQL_MODE='ANSI'设置
 5、为什么SQL_MODE='ANSI'会导致最开始的报错呢,查看AI+文档确认,ANSI 模式是 MySQL 中一个 复合模式,包含 only_full_group_by 等多个子模式(等价于 sql_mode='REAL_AS_FLOAT, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, and ONLY_FULL_GROUP_BY'),于是导致最开始的报错
5、为什么SQL_MODE='ANSI'会导致最开始的报错呢,查看AI+文档确认,ANSI 模式是 MySQL 中一个 复合模式,包含 only_full_group_by 等多个子模式(等价于 sql_mode='REAL_AS_FLOAT, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, and ONLY_FULL_GROUP_BY'),于是导致最开始的报错
 
 6、为什么用--compatible=ansi参数,估计是为了跨数据库兼容性。
6、为什么用--compatible=ansi参数,估计是为了跨数据库兼容性。

 
 
                     
            
        













 
                    

 
                 
                    