Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

occ db:convert-type mysql -> UniqueConstraintViolationException #4914

Closed
hostingnuggets opened this issue May 17, 2017 · 18 comments · Fixed by #5772
Closed

occ db:convert-type mysql -> UniqueConstraintViolationException #4914

hostingnuggets opened this issue May 17, 2017 · 18 comments · Fixed by #5772
Labels
Milestone

Comments

@hostingnuggets
Copy link

Steps to reproduce

  1. run: occ db:convert-type --all-apps --clear-schema mysql db username hostname database

Expected behaviour

Migrate Nextcloud PostgreSQL database to MySQL without any issues.

Actual behaviour

oc_filecache
chunked query, 15 chunks
  5700/14898 [==========>-----------------]  38%
                                                                                                                                                                                   
  [Doctrine\DBAL\Exception\UniqueConstraintViolationException]                                                                                                                     
  An exception occurred while executing 'INSERT INTO `oc_filecache` (`fileid`, `storage`, `path`, `path_hash`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `mtime`, `storag  
  e_mtime`, `encrypted`, `unencrypted_size`, `etag`, `permissions`, `checksum`) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' with params [463919, 1, "files\/000_Folder\/Directory\/file.odt", "4a1f98565842fa63d3398b42198dd7bd", 463857, "file.odt", 7, 5, 73841, 147109182  
  3, 1471091823, 0, 0, "8756a2b3c9cebbb0aec8d1bd8d296030", 27, ""]:                                                                                                                
  SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '463919' for key 'PRIMARY'                                                                            
 
 [Doctrine\DBAL\Driver\PDOException]                                                               
  SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '463919' for key 'PRIMARY'  
               
  [PDOException]                                                                                    
  SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '463919' for key 'PRIMARY'                                                                                                 

Server configuration

Operating system: Debian 7

Web server: nginx 1.8.1

Database: 9.1.24

PHP version: 5.6.30

Nextcloud version: 11.0.2

Updated from an older Nextcloud/ownCloud or fresh install: yes, updated

Where did you install Nextcloud from: from the shell

Signing status:

Signing status
No errors have been found.

List of activated apps:

App list
Enabled:
  - activity: 2.4.1
  - admin_audit: 1.1.0
  - bookmarks: 0.10.0
  - calendar: 1.5.2
  - comments: 1.1.0
  - contacts: 1.5.3
  - dav: 1.1.1
  - federatedfilesharing: 1.1.1
  - federation: 1.1.1
  - files: 1.6.1
  - files_pdfviewer: 1.0.1
  - files_sharing: 1.1.1
  - files_texteditor: 2.2
  - files_trashbin: 1.1.0
  - files_versions: 1.4.0
  - files_videoplayer: 1.0.0
  - firstrunwizard: 2.0
  - gallery: 16.0.0
  - logreader: 2.0.0
  - lookup_server_connector: 1.0.0
  - nextcloud_announcements: 1.0
  - notifications: 1.0.1
  - password_policy: 1.1.0
  - provisioning_api: 1.1.0
  - serverinfo: 1.1.1
  - sharebymail: 1.0.1
  - survey_client: 0.1.5
  - systemtags: 1.1.3
  - tasks: 0.9.5
  - templateeditor: 0.2
  - theming: 1.1.1
  - twofactor_backupcodes: 1.0.0
  - updatenotification: 1.1.1
  - user_ldap: 1.1.2
  - workflowengine: 1.1.1
Disabled:
  - encryption
  - external
  - files_accesscontrol
  - files_automatedtagging
  - files_external
  - files_retention
  - richdocuments
  - user_external
  - user_saml

Nextcloud configuration:

Config report
{
    "system": {
        "instanceid": "ocrioxxj1qez",
        "passwordsalt": "***REMOVED SENSITIVE VALUE***",
        "secret": "***REMOVED SENSITIVE VALUE***",
        "trusted_domains": [
            "cloud.domain.com"
        ],
        "datadirectory": "\/srv\/nextcloud\/data",
        "overwrite.cli.url": "https:\/\/cloud.domain.com",
        "dbtype": "pgsql",
        "version": "11.0.2.7",
        "dbname": "nc",
        "dbhost": "localhost",
        "dbtableprefix": "oc_",
        "dbuser": "***REMOVED SENSITIVE VALUE***",
        "dbpassword": "***REMOVED SENSITIVE VALUE***",
        "installed": true,
        "forcessl": true,
        "forceSSLforSubdomains": true,
        "mail_from_address": "cloud",
        "mail_smtpmode": "php",
        "mail_domain": "domain.comt",
        "ldapIgnoreNamingRules": false,
        "maintenance": false,
        "theme": "mytheme",
        "loglevel": 2,
        "logtimezone": "Europe\/Berlin",
        "trashbin_retention_obligation": "auto,30",
        "memcache.local": "\\OC\\Memcache\\APCu",
        "updater.release.channel": "stable",
        "ldapProviderFactory": "\\OCA\\User_LDAP\\LDAPProviderFactory",
        "appstore.experimental.enabled": true,
        "activity_expire_days": 180
    }
}

Are you using external storage, if yes which one: local

Are you using encryption: no

Are you using an external user-backend, if yes which one: LDAP

LDAP configuration (delete this part if not used)

LDAP config
+-------------------------------+---------------------------------------------------------------------------------------------------+
| Configuration                 | s01                                                                                               |
+-------------------------------+---------------------------------------------------------------------------------------------------+
| hasMemberOfFilterSupport      | 0                                                                                                 |
| hasPagedResultSupport         |                                                                                                   |
| homeFolderNamingRule          |                                                                                                   |
| lastJpegPhotoLookup           | 0                                                                                                 |
| ldapAgentName                 | cn=proxyagent,ou=ldapusers,dc=domain,dc=com                                                      |
| ldapAgentPassword             | ***                                                                                               |
| ldapAttributesForGroupSearch  |                                                                                                   |
| ldapAttributesForUserSearch   |                                                                                                   |
| ldapBackupHost                | ldap2.domain.com                                                                           |
| ldapBackupPort                | 389                                                                                               |
| ldapBase                      | ou=people,dc=domain,dc=com                                                                       |
| ldapBaseGroups                | ou=people,dc=domain,dc=com                                                                       |
| ldapBaseUsers                 | ou=people,dc=domain,dc=com                                                                      |
| ldapCacheTTL                  | 600                                                                                               |
| ldapConfigurationActive       | 1                                                                                                 |
| ldapDynamicGroupMemberURL     |                                                                                                   |
| ldapEmailAttribute            | mail                                                                                              |
| ldapExperiencedAdmin          | 0                                                                                                 |
| ldapExpertUUIDGroupAttr       |                                                                                                   |
| ldapExpertUUIDUserAttr        |                                                                                                   |
| ldapExpertUsernameAttr        | uid                                                                                               |
| ldapGroupDisplayName          | cn                                                                                                |
| ldapGroupFilter               |                                                                                                   |
| ldapGroupFilterGroups         |                                                                                                   |
| ldapGroupFilterMode           | 1                                                                                                 |
| ldapGroupFilterObjectclass    |                                                                                                   |
| ldapGroupMemberAssocAttr      | uniqueMember                                                                                      |
| ldapHost                      | ldap1.domain.com                                                                           |
| ldapIgnoreNamingRules         |                                                                                                   |
| ldapLoginFilter               | (&(|(objectclass=inetOrgPerson))(uid=%uid)(memberOf=cn=cloud,ou=groups,dc=domain,dc=com)) |
| ldapLoginFilterAttributes     |                                                                                                   |
| ldapLoginFilterEmail          | 0                                                                                                 |
| ldapLoginFilterMode           | 1                                                                                                 |
| ldapLoginFilterUsername       | 1                                                                                                 |
| ldapNestedGroups              | 0                                                                                                 |
| ldapOverrideMainServer        | 0                                                                                                 |
| ldapPagingSize                | 500                                                                                               |
| ldapPort                      | 389                                                                                               |
| ldapQuotaAttribute            |                                                                                                   |
| ldapQuotaDefault              |                                                                                                   |
| ldapTLS                       | 1                                                                                                 |
| ldapUserDisplayName           | cn                                                                                                |
| ldapUserDisplayName2          |                                                                                                   |
| ldapUserFilter                | (|(objectclass=inetOrgPerson))                                                                    |
| ldapUserFilterGroups          |                                                                                                   |
| ldapUserFilterMode            | 0                                                                                                 |
| ldapUserFilterObjectclass     | inetOrgPerson                                                                                     |
| ldapUuidGroupAttribute        | auto                                                                                              |
| ldapUuidUserAttribute         | auto                                                                                              |
| turnOffCertCheck              | 0                                                                                                 |
| turnOnPasswordChange          | 0                                                                                                 |
| useMemberOfToDetectMembership | 1                                                                                                 |
+-------------------------------+---------------------------------------------------------------------------------------------------+

Client configuration

Browser: Firefox 45.0.9

Operating system: Debian 8

Logs

Web server error log

Web server error log
nothing relevant

Nextcloud log (data/nextcloud.log)

Nextcloud log
nothing relevant

Browser log

Browser log
n/a
@MorrisJobke
Copy link
Member

cc @nickvergessen @icewind1991 🙈

@nickvergessen
Copy link
Member

This happens on the migration or afterwards?

@hostingnuggets
Copy link
Author

@nickvergessen this happens during the occ db:convert-type command, as soon as this error gets thrown it aborts the whole process and bails out with the error messages I have submitted. I had the same problem first with the oc_activity table but I could empty this table so I bypassed this issue but afaik it is not possible to empty the oc_filecache table, else I will have another type of issue (no files)...

@cbrompton
Copy link

cbrompton commented Jun 3, 2017

I can confirm I've had the same issue going from sqlite to mysql
here's my error output:

  An exception occurred while executing 'INSERT INTO `oc_filecache` (`fileid`, `storage`, `path`, `path_hash`, `parent`, `name`, `mimetype`, `mimepart`, `size`, `  
  mtime`, `storage_mtime`, `encrypted`, `unencrypted_size`, `etag`, `permissions`, `checksum`) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)' with params  
   ["75340", "9", "appdata_ocnocud4wwks\/js\/core\/merged-share-backend.js.deps", "afe08a1c719049620553406d7946ef07", "33467", "merged-share-backend.js.deps", "7"  
  , "5", "682", "1495772154", "1495772154", "0", "0", "8ccf85b6f2a469a8bf212e73d0c7a5d3", "27", ""]:                                                                
  SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '9-afe08a1c719049620553406d7946ef07' for key 'fs_storage_path_hash'                         
                                                                                                                                                                    

                                                                                                                                             
  [Doctrine\DBAL\Driver\PDOException]                                                                                                        
  SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '9-afe08a1c719049620553406d7946ef07' for key 'fs_storage_path_hash' 
                                                                                                                                             

                                                                                                                                             
  [PDOException]                                                                                                                             
  SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '9-afe08a1c719049620553406d7946ef07' for key 'fs_storage_path_hash' ```

@nickvergessen
Copy link
Member

@cbrompton What does the query return on your old database:

SELECT * FROM `oc_filecache` WHERE `storage` = 9 AND `path_hash` = 'afe08a1c719049620553406d7946ef07'

@hostingnuggets What does the query return on your old database:

SELECT * FROM `oc_filecache` WHERE `fileid` = 463919

@hostingnuggets
Copy link
Author

@nickvergessen below is the ouput of your query. I have modified the directory/filename for privacy reasons.

-[ RECORD 1 ]----+---------------------------------------------------------------------------
fileid           | 463919
storage          | 1
path             | files/Directory/file.odt
path_hash        | 4a1f98565842fa63d3398b42198dd7bd
parent           | 463857
name             | file.odt
mimetype         | 7
mimepart         | 5
size             | 73841
mtime            | 1471091823
storage_mtime    | 1471091823
encrypted        | 0
unencrypted_size | 0
etag             | 8756a2b3c9cebbb0aec8d1bd8d296030
permissions      | 27
checksum         | 

@hostingnuggets
Copy link
Author

@nickvergessen was my output above helpful or do you need any more information?

@nickvergessen
Copy link
Member

yeah a bit, but it is very odd.
The path_hash does not belong to the path. So something went wrong there somehow.
But I couldn't figure out what it is yet.

@nickvergessen
Copy link
Member

Okay the wrong hash aside. There is no order command on the import queries.
Since we chunk those here, I guess the order changed between chunk 14 and 15 and therefor we are importing the same item twice. 😕

The only think I can see is to hardcode order-by options for known tables. 😞

@nickvergessen
Copy link
Member

@MorrisJobke you have any other idea?

@MorrisJobke
Copy link
Member

@MorrisJobke you have any other idea?

No :/

@hostingnuggets
Copy link
Author

From a user perspective is there any workaround on how I can migrate from PostgreSQL to MySQL without having to use the occ command?

@MorrisJobke
Copy link
Member

From a user perspective is there any workaround on how I can migrate from PostgreSQL to MySQL without having to use the occ command?

No. There is no other way than using our command line tool.

@hostingnuggets
Copy link
Author

@MorrisJobke I guess I will simply have to wait that you guys find the worm in this migration command.

@hostingnuggets
Copy link
Author

Well done guys! So this should fix my migration issue if I understand correctly? and is it possible that this feature will be available with Nextcloud 12.0.x or do I need to wait for Nextcloud 13?

@nickvergessen
Copy link
Member

13 sadly, because the required changes are too big.

@hostingnuggets
Copy link
Author

No problem I will have to show a bit more patience in order to migrate away from PostgreSQL.

@nickvergessen
Copy link
Member

You can try to hardcode it for the filecache, but then you will get a similar issue on the next table... So I would suggest to wait, thanks 😸

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants