forum.bitel.ru http://forum.bitel.ru/ |
|
Duplicate entry for key 'PRIMARY' (CRM) http://forum.bitel.ru/viewtopic.php?f=44&t=12551 |
Страница 1 из 1 |
Автор: | ok-2004 [ 23 июл 2017, 14:23 ] |
Заголовок сообщения: | Duplicate entry for key 'PRIMARY' |
Доброё ВС! В /usr/local/BGBillingServer/log/scheduler.error.log: Код: scheduler 07-22/20:11:16 ERROR [pool-1-thread-4] InetRecalculator - ru.bitel.bgbilling.common.BGException: ru.bitel.bgbilling.common.BGException: Ошибка на acconting-сервере at ru.bitel.bgbilling.modules.inet.accounting.recalculate.task.InetRecalculator.calculate(InetRecalculator.java:319) at ru.bitel.bgbilling.modules.inet.accounting.recalculate.task.InetRecalculator.executeTask(InetRecalculator.java:129) at bitel.billing.server.task.bean.RunTask.run(RunTask.java:47) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:748) Caused by: ru.bitel.bgbilling.common.BGException: Ошибка на acconting-сервере at ru.bitel.bgbilling.modules.inet.accounting.recalculate.task.InetRecalculator$AccountingEventSender.send(InetRecalculator.java:493) at ru.bitel.bgbilling.modules.inet.accounting.recalculate.task.InetRecalculator.calculateCurrentDay(InetRecalculator.java:351) at ru.bitel.bgbilling.modules.inet.accounting.recalculate.task.InetRecalculator.calculate(InetRecalculator.java:296) ... 5 more Соответствующая ошибка в /usr/local/BGInetAccounting/log/error.log: Код: recalculate 07-22/20:11:22 ERROR [worker-p-27-t-1] SessionRecalculateTarifficationManager - Duplicate entry '9268348-22-19-1' for key 'PRIMARY' com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '9268348-22-19-1' for key 'PRIMARY' at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at com.mysql.jdbc.Util.handleNewInstance(Util.java:404) at com.mysql.jdbc.Util.getInstance(Util.java:387) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:932) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3878) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3814) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2478) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2625) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2551) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1861) at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2073) at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2009) at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5094) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1994) at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105) at ru.bitel.bgbilling.modules.inet.accounting.recalculate.day.current.SessionRecalculateCurrentDayTarifficationManager.initDetailPSAndRS(SessionRecalculateCurrentDayTarifficationManager.java:125) at ru.bitel.bgbilling.modules.inet.accounting.recalculate.SessionRecalculateTarifficationManager.recalculate(SessionRecalculateTarifficationManager.java:235) at ru.bitel.bgbilling.modules.inet.accounting.recalculate.SessionRecalculateTarifficationManager.run(SessionRecalculateTarifficationManager.java:148) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:748) at ru.bitel.common.worker.WorkerThread.run(WorkerThread.java:46) Вопросы: -О какой таблице идёт речь ? -Как в принципе могло случиться неуникальное значение в основном ключе ? -Как это исправить ? Информация о версии: Клиент: вер. 6.2.862 / 30.05.2017 03:57:55 os: Linux; java: Java HotSpot(TM) Server VM, v.1.8.0_66 Сервер: вер. 6.2.1184 / 30.05.2017 04:17:11 os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_131 bill: вер. 6.2.103 / 12.05.2017 18:50:32 card: вер. 6.2.43 / 16.03.2017 23:47:47 dialup: вер. 6.2.316 / 12.05.2017 18:52:28 drweb: вер. 6.2.71 / 09.03.2016 11:43:11 email: вер. 6.2.177 / 14.12.2016 14:27:42 inet: вер. 6.2.720 / 30.05.2017 03:55:47 ipn: вер. 6.2.264 / 09.01.2017 16:41:56 mps: вер. 6.2.225 / 17.05.2017 18:35:37 npay: вер. 6.2.200 / 30.05.2017 04:17:18 payonline: вер. 6.2.65 / 01.06.2017 15:55:49 rentsoft: вер. 6.2.63 / 04.10.2016 19:16:26 reports: вер. 6.2.217 / 02.05.2017 12:37:22 ru.bitel.bgbilling.plugins.crm: вер. 6.2.195 / 04.10.2016 19:16:05 ru.bitel.bgbilling.plugins.dispatch: вер. 6.2.97 / 12.05.2017 18:50:40 ru.bitel.bgbilling.plugins.documents: вер. 6.2.176 / 14.12.2016 14:33:16 ru.bitel.bgbilling.plugins.helpdesk: вер. 6.2.182 / 04.10.2016 19:16:06 trayinfo: вер. 6.2.171 / 10.03.2017 18:11:41 voiceip: вер. 6.2.192 / 12.05.2017 18:50:31 wm: вер. 6.2.189 / 04.10.2016 19:16:46 yamoney: вер. 6.2.58 / 04.10.2016 19:16:49 Окружение: Клиент: os: Linux i386, 3.13.0-117-generic java: Java HotSpot(TM) Server VM, v.1.8.0_66 jre home: /home/oleg/BGBillingClient_6.2/jdk1.8.0_66/jre default tz: 23.07.2017 11:25 MSK +0300 (Europe/Moscow) user tz: 23.07.2017 11:25 MSK +0300 (Europe/Moscow) locale: ru_RU Сервер: os: Linux amd64, 4.4.0-78-generic java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_131 jre home: /opt/java/jdk1.8.0_131/jre default tz: 23.07.2017 11:25 MSK +0300 (Europe/Moscow) db time: master: 23.07.2017 11:25 MSK db charset: connection: utf8(utf8_unicode_ci), database: utf8(utf8_unicode_ci) locale: en_US uptime: Started: 11.06.2017 08:18:27 Uptime: 42 d 03:07:03 |
Автор: | stark [ 25 июл 2017, 12:03 ] |
Заголовок сообщения: | Re: Duplicate entry for key 'PRIMARY' (CRM) |
Покажите Код: show create table inet_session_detail_$mid $mid - ваш код модуля inet. Там ключ состоит из 5 полей, а у вас похоже их четырех. Там должен быть примениться запрос при обновлении (давно еще) : Код: ALTER TABLE `inet_session_detail_$mid` DROP PRIMARY KEY , ADD PRIMARY KEY (`sessionId`, `day`, `hour`, `trafficTypeId`, `deviceId`); Там раньше был ключ без deviceId и у вас как-будто он. Даже если так, то все равно есть вопрос - как вы собираете трафик , у вас на одной сессии один источник трафика с одного устройства? Я про sessionId=9268348, day=22, hour=19, trafficTypeId=1. Возможно эта сессия уже завершилась, тогда она в inet_session_log_detail_$mid_201707. Возможно есть какая-то ошибка, лучше напишите в helpdesk, дайте доступ чтобы посмотреть. |
Автор: | ok-2004 [ 25 июл 2017, 13:27 ] |
Заголовок сообщения: | Re: Duplicate entry for key 'PRIMARY' (CRM) |
нет - в составном ключе - 5 полей: Код: CREATE TABLE `inet_session_detail_10` ( `sessionId` bigint(20) NOT NULL, `day` tinyint(4) NOT NULL, `hour` tinyint(4) NOT NULL, `trafficTypeId` int(11) NOT NULL, `deviceId` int(11) NOT NULL, `amount` bigint(20) NOT NULL, PRIMARY KEY (`sessionId`,`day`,`hour`,`trafficTypeId`,`deviceId`), KEY `sessionId` (`sessionId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci /*!50100 PARTITION BY HASH ( sessionId) PARTITIONS 8 */ Эта сессия действительно уехала в архив: Код: mysql> select * from inet_session_log_detail_10_201707 where sessionid=9268348; +-----------+-----+------+---------------+----------+--------+ | sessionId | day | hour | trafficTypeId | deviceId | amount | +-----------+-----+------+---------------+----------+--------+ | 9268348 | 22 | 19 | 0 | 0 | 2965 | | 9268348 | 22 | 19 | 1 | 25 | 652 | | 9268348 | 22 | 19 | 2 | 25 | 967 | | 9268348 | 22 | 20 | 0 | 0 | 670 | +-----------+-----+------+---------------+----------+--------+ 4 rows in set (0.00 sec) В этой таблице смущают все строчки кроме 2-ой. Так как трафиком юзера типа 1 ( netflow ) рулит устройство 26, а информация о трафике снимается с устройства 25: Код: mysql> select * from inet_session_log_10_201707 where id=9268348\G
*************************** 1. row *************************** id: 9268348 parentId: 0 splittedId: 0 connectionId: 6542365 parentConnectionId: 0 deviceId: 26 devicePort: 11 agentDeviceId: 0 acctSessionId: NULL username: NULL realm: NULL type: 0 accessCode: 0 servId: 7586 calledStationId: NULL callingStationId: NULL ipResourceId: 0 ipAddress: NULL connectionStart: 2017-07-22 19:10:35 sessionStart: 2017-07-22 19:10:35 sessionStop: 2017-07-22 20:11:09 lastActive: 2017-07-22 19:10:35 deviceState: 1 deviceOptions: sessionTime: 3635 sessionCost: 0.00000 status: 4 1 row in set (0.00 sec) |
Автор: | stark [ 25 июл 2017, 14:43 ] |
Заголовок сообщения: | Re: Duplicate entry for key 'PRIMARY' (CRM) |
ok-2004 писал(а): В этой таблице смущают все строчки кроме 2-ой. Так как трафиком юзера типа 1 ( netflow ) рулит устройство 26, а информация о трафике снимается с устройства 25: Не понял что вас смущает, тут все нормально. Вопрос в том почему при переобсчете текущего дня, когда эта сессия еще была в текущих ее попытались вставить второй раз. Я изучаю этот вопрос. Там вообще переобсчет текущего дня сложный процесс, следует избегать его по мере возможности. |
Автор: | stark [ 25 июл 2017, 14:51 ] |
Заголовок сообщения: | Re: Duplicate entry for key 'PRIMARY' (CRM) |
Возможно, я нашел ошибку, пока разбираюсь с ней. |
Автор: | stark [ 25 июл 2017, 18:17 ] |
Заголовок сообщения: | Re: Duplicate entry for key 'PRIMARY' (CRM) |
Проблема не с inet_session_detail_10, а с нашей темповой таблицей, которую мы создаем при переобсчете текущего дня. Там ключ из 4-х полей состоит . Я понял так получилось. У вас во время переобсчета 2017-07-22 20:11:09 как раз завершилась сессия по stop-у или timeout. И ее перенесли в другую таблицу. Из-за этого возникла ошибка. Исправлено. Обновление выкладывается. |
Страница 1 из 1 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |