Impossible d'insérer dans la base de données ClickHouse en raison d'autorisations insuffisantes: / var / lib / clickhouse / data /

Dec 15 2020

J'ai créé une instance d'un ClickHouse DB dans un conteneur via docker-compose:

version: '3'

services:
  ch:
    image: yandex/clickhouse-server
    restart: on-failure
    volumes:
      - '/mnt/c/DevTools/source/storm/clickhouse_setup/data/ch:/var/lib/clickhouse/'
      - './ch_configs:/etc/clickhouse-server/'
    ports:
      - 9000:9000
      - 8123:8123
    ulimits:
      nofile: 262144
    
  client:
    image: yandex/clickhouse-client
    volumes:
      - './client-config.xml:/etc/clickhouse-client/config.xml'

Je peux y accéder et trouver la base de données que j'ai créée, mais quand je cours

INSERT INTO simple_people (id, first_name, last_name) VALUES(1,'david','lo')

J'obtiens cette réponse:

Query id: 46ef1af8-5728-425e-87f5-511f7e0e79d1
Received exception from server (version 20.12.3):
Code: 1000. DB::Exception: Received from ch:9000. DB::Exception: Access to file denied: insufficient permissions: /var/lib/clickhouse/data/registry/simple_people/tmp_insert_1_2_2_0.
1 rows in set. Elapsed: 0.068 sec.

Comment obtenir la permission d'INSERER DANS?

Remarques:

Je n'ai aucun problème à courir:

SELECT * FROM simple_people

Je suis sur WSL: Ubuntu-20.04

Réponses

1 DennyCrane Dec 16 2020 at 00:27

C'est à cause du docker WSL +.

Essayez le chemin complet au lieu de ./data

1 sh0ck_wave Dec 21 2020 at 04:42

J'ai installé clickhouse directement sur WSL Ubuntu 18.04 sur le serveur Windows 2019 sans docker et j'ai rencontré le même problème. Dans mon cas, j'essayais d'insérer des données dans une table avec la configuration de la politique de stockage ClickHouse afin que toutes les données soient stockées dans / mnt / f / clickhouse (F: \ clickhouse sur Windows). L'erreur que j'ai eue était:

DB::Exception: Access to file denied: insufficient permissions: /mnt/f/clickhouse/store/1e6/1e69cad8-25a1-4ec5-ab5b-fb32d73b7c8c/tmp_insert_all_2_2_0

Le correctif du problème consistait à activer la fonctionnalité de métadonnées sur WSL qui synchronise les autorisations entre Linux et Windows en remontant le lecteur F: avec la fonctionnalité activée. Et puis recréez le dossier clickhouse s'il existe déjà.

sudo umount /mnt/f
sudo mount -t drvfs F: /mnt/f -o metadata

Informations supplémentaires

Si vous avez des questions sur la façon de configurer une politique de stockage sur Clickhouse pour choisir l'emplacement de vos données. Voici le contenu de mon /etc/clickhouse-server/config.d/storage.xml

<yandex>
  <storage_configuration>
    <disks>
      <!--
          default disk is special, it always
          exists even if not explicitly
          configured here, but you can't change
          it's path here (you should use <path>
          on top level config instead)
      -->
      <default>
         <!--
             You can reserve some amount of free space
             on any disk (including default) by adding
             keep_free_space_bytes tag
         -->
         <keep_free_space_bytes>1024</keep_free_space_bytes>
      </default>

      <mnt_f>
         <!--
         disk path must end with a slash,
         folder should be writable for clickhouse user
         -->
         <path>/mnt/f/clickhouse/</path>
      </mnt_f>
    </disks>
    <policies>
      <mnt_f_only> <!-- name for new storage policy -->
        <volumes>  
          <mnt_f_volume> <!-- name of volume -->
            <!-- 
                we have only one disk in that volume  
                and we reference here the name of disk
                as configured above in <disks> section
            -->
            <disk>mnt_f</disk>
          </mnt_f_volume>
        </volumes>
      </mnt_f_only>
    </policies>
  </storage_configuration>
</yandex>

Choisissez la politique de stockage lors de la création de la table:

CREATE TABLE test(
    EventId String,
    EventName Nullable(String),
) ENGINE = MergeTree()
ORDER BY EventId
SETTINGS storage_policy = 'mnt_f_only';