iverycd / OracleSync2MySQL

Oracle to MySQL, PolarDB, Percona Server MySQL, MariaDB, OceanBase, TiDB, GaussDB for MySQL
MIT License
43 stars 16 forks source link

转换时报如下错误:ORA-12516: TNS:listener could not find available handler with matching protocol stack #1

Open dreamyb110 opened 11 months ago

dreamyb110 commented 11 months ago

操作系统:win8.1 数据库:oracle11.2.0.1 mysql8.0.28 OracleSync2MySQL:OracleSync2MySQL-win-x64-v0.0.7

转换时报如下错误: level=fatal msg="select trim(',' from (xmlagg(xmlparse(content '\"'||column_name||'\"'||',') order by COLUMN_ID).getclobval())) from user_tab_columns where table_name='这是表名' exec failed pool=0xdd8bf9bef0 stats=busy=123 open=123 max=0 maxLifetime=0s timeout=5m0s waitTimeout=0s params={authMode:0 connectionClass: connectionClassLength:0 purity:0 newPassword: newPasswordLength:0 appContext: numAppContext:0 externalAuth:0 externalHandle: pool:0xdd8bf9bef0 tag: tagLength:0 matchAnyTag:0 outTag: outTagLength:0 outTagFound:0 shardingKeyColumns: numShardingKeyColumns:0 superShardingKeyColumns: numSuperShardingKeyColumns:0 outNewSession:0}: ORA-12516: TNS:listener could not find available handler with matching protocol stack" func=OracleSync2MySQL/cmd.prepareSqlStr file="C:/go/src/OracleSync2MySQL/cmd/root.go:319"

请问这个如何解决,谢谢!

iverycd commented 11 months ago

麻烦看下数据库的连接数参数 查询语句 --- 当前已启用进程数 select count(*) from v$process;

--- 查询参数里限制的最大进程数 select value from v$parameter where name = 'processes';

dreamyb110 commented 10 months ago

库表有300个左右,数据有500M。加这个进程数还是会连接数用完异常。看了一下源代码,是多线程引起的。

另外这几个查不到数据,因为大小写不对应,需要改为大写比较或小写比较 select count(*) from user_tab_columns where UPPER(table_name)=UPPER('%s')

SELECT A.COLUMN_NAME,A.DATA_TYPE,A.CHAR_LENGTH,case when A.NULLABLE ='Y' THEN 'YES' ELSE 'NO' END as isnull, LONG_TO_CHAR(A.TABLE_NAME,A.COLUMN_ID) DATA_DEFAULT,case when A.DATA_PRECISION is null then -1 else A.DATA_PRECISION end DATA_PRECISION,case when A.DATA_SCALE is null then -1 when A.DATA_SCALE >30 then least(A.DATA_PRECISION,30)-1 else A.DATA_SCALE end DATA_SCALE, nvl(B.COMMENTS,'null') COMMENTS,case when a.AVG_COL_LEN is null then -1 else a.AVG_COL_LEN end AVG_COL_LEN,COLUMN_ID FROM USER_TAB_COLUMNS A LEFT JOIN USER_COL_COMMENTS B ON A.TABLE_NAME=B.TABLE_NAME AND A.COLUMN_NAME=B.COLUMN_NAME WHERE UPPER(A.TABLE_NAME)=UPPER('%s') ORDER BY COLUMN_ID

select trim(',' from (xmlagg(xmlparse(content '\"'||column_name||'\"'||',') order by COLUMN_ID).getclobval())) from user_tab_columns where UPPER(table_name)=UPPER('%s')

多线程的建议: 1、表结构的处理,主键处理,外键处理,索引创建可以使用单线程,减少使用数据库连接数。 2、表数据迁移,使用多线程,线程总数需要可控,太多了会把数据库连接数用完。可以采用每个表一个线程去迁移数据,最多5个,10个,这个可以读配置参数,不易太多。

还是非常感谢提供的这个工具。

iverycd commented 10 months ago

你好,感谢你的建议,我设计之初有设计过参数maxParallel,用来控制goroutine的最大并发数,我本地有500多个表,迁移的全程查看select count(*) from v$process;排除非关联用户之外,连接数并未超过maxParallel,请问下你的环境产生了多少连接数

iverycd commented 10 months ago

库表有300个左右,数据有500M。加这个进程数还是会连接数用完异常。看了一下源代码,是多线程引起的。

另外这几个查不到数据,因为大小写不对应,需要改为大写比较或小写比较 select count(*) from user_tab_columns where UPPER(table_name)=UPPER('%s')

SELECT A.COLUMN_NAME,A.DATA_TYPE,A.CHAR_LENGTH,case when A.NULLABLE ='Y' THEN 'YES' ELSE 'NO' END as isnull, LONG_TO_CHAR(A.TABLE_NAME,A.COLUMN_ID) DATA_DEFAULT,case when A.DATA_PRECISION is null then -1 else A.DATA_PRECISION end DATA_PRECISION,case when A.DATA_SCALE is null then -1 when A.DATA_SCALE >30 then least(A.DATA_PRECISION,30)-1 else A.DATA_SCALE end DATA_SCALE, nvl(B.COMMENTS,'null') COMMENTS,case when a.AVG_COL_LEN is null then -1 else a.AVG_COL_LEN end AVG_COL_LEN,COLUMN_ID FROM USER_TAB_COLUMNS A LEFT JOIN USER_COL_COMMENTS B ON A.TABLE_NAME=B.TABLE_NAME AND A.COLUMN_NAME=B.COLUMN_NAME WHERE UPPER(A.TABLE_NAME)=UPPER('%s') ORDER BY COLUMN_ID

select trim(',' from (xmlagg(xmlparse(content '"'||column_name||'"'||',') order by COLUMN_ID).getclobval())) from user_tab_columns where UPPER(table_name)=UPPER('%s')

多线程的建议: 1、表结构的处理,主键处理,外键处理,索引创建可以使用单线程,减少使用数据库连接数。 2、表数据迁移,使用多线程,线程总数需要可控,太多了会把数据库连接数用完。可以采用每个表一个线程去迁移数据,最多5个,10个,这个可以读配置参数,不易太多。

还是非常感谢提供的这个工具。

你好,我平常是在MacOS上进行ide开发,主要使用环境是MacOSCentOS。 现在观察发现在Windows系统下,多个并发协程有很多未关闭连接导致oracle上有很多inactive不活动的会话。在MacOSCentOS上使用正常,非常感谢你发现的问题,我会及时修复这个issue

iverycd commented 10 months ago

最新版本已发布