1. Introduction
1.1 Qu'est-ce que MIRAJ#
MIRAJ est un moteur de base de données SQL relationnel en colonnes, en mémoire et durable, développé par CIRTASOFT (https://cirtasoft.com/mirajdb). Il stocke les données de chaque table colonne par colonne, garde ces colonnes en mémoire pour l'exécution des requêtes, et assure la durabilité des écritures par un journal d'écriture rejoué au redémarrage.
MIRAJ est aussi optimisé pour l'intelligence artificielle. Parce que les données résident en mémoire vive (RAM) plutôt que sur disque dur, les lectures ne subissent pas la latence des accès disque : les charges typiques de l'IA (préparation et exploration de grands jeux de données, extraction de caractéristiques, requêtes répétées et concurrentes d'agents ou de services d'inférence, recherche par similarité avec la recherche vectorielle) s'exécutent à la vitesse de la mémoire, sans renoncer à la durabilité assurée par le journal d'écriture.
Enfin, MIRAJ propose une option MCP : le serveur peut ouvrir un point d'accès pour les assistants d'intelligence artificielle (Claude Code, ou tout client du protocole Model Context Protocol). L'assistant explore la structure des bases, lit ou modifie les données, voire administre le serveur, sans pilote ni mot de passe : il reçoit un jeton créé en SQL, lié à un compte et plafonné à un niveau d'accès (STRUCTURE, READ, WRITE, ADMIN). L'option est désactivée par défaut et n'est pas disponible dans l'édition Express ; voir le chapitre 20.
MIRAJ s'adresse :
- aux développeurs qui veulent embarquer un moteur SQL rapide dans une application (bureau, service, outil de traitement de données) sans dépendre d'un serveur externe ;
- aux développeurs qui construisent des applications client/serveur classiques et veulent un serveur SQL accessible par le réseau, compatible avec les outils et connecteurs existants ;
- aux administrateurs de bases de données (DBA) qui exploitent un ou plusieurs serveurs MIRAJ : création de comptes, gestion des privilèges, surveillance, sauvegardes, réplication.
Cas d'usage typiques : applications métier avec une base locale embarquée, serveur de données pour une application client/serveur ou web, calculs analytiques sur des volumes tenant en mémoire (les grosses tables d'historique pouvant rester sur disque), applications d'intelligence artificielle (données d'entraînement, contexte pour agents, recherche vectorielle), assistants IA branchés sur les bases par l'option MCP, consolidation de plusieurs bases derrière un même serveur, déploiement en grappe pour la disponibilité en lecture.
Ce manuel s'adresse aux utilisateurs finaux de MIRAJ (développeurs et DBA) : il décrit le langage SQL, les outils fournis (miraj-cli, miraj-server) et leur administration. Il ne décrit pas l'implémentation interne du moteur.
1.2 Les trois façons d'utiliser MIRAJ#
| Mode | Description | Pour qui |
|---|---|---|
| Embarqué | Le moteur tourne dans le processus de l'application, par la bibliothèque dynamique miraj.dll (libmiraj.dylib sous macOS, libmiraj.so sous Linux ; API C décrite par miraj.h) et ses enveloppes : Delphi (Miraj.pas), C#, C++, Python, Java, PHP, Node.js, Go. Aucun processus séparé, aucune connexion réseau. | Applications qui embarquent leurs propres données, sans serveur à déployer. |
| Ligne de commande | La console SQL interactive miraj-cli ouvre directement un dossier de données (serveur arrêté) ou se connecte à un serveur miraj-server, et exécute des instructions SQL en mode interactif (REPL), une instruction donnée par -e ou un fichier .sql. | Administration, scripts, exploration ponctuelle des données. |
| Serveur réseau | miraj-server écoute sur un port TCP (7007 par défaut) et sert des sessions SQL à des clients distants, avec un protocole client/serveur SQL standard du marché : les connecteurs, outils d'administration et clients existants s'y connectent sans adaptation. Il peut ouvrir en plus un point d'accès REST (JSON sur HTTP) et un point d'accès MCP pour les assistants d'intelligence artificielle. | Applications client/serveur, applications web, accès concurrent de plusieurs applications à une même base. |
Ces trois modes partagent le même moteur et le même format de fichier de données : une base ouverte en embarqué peut être servie plus tard par miraj-server, et inversement. Un dossier de données n'est ouvert que par un processus à la fois : pendant que miraj-server tourne, la console et les applications passent par le réseau.
Deux langages SQL : MIRAJ ou PostgreSQL#
Une instance de miraj-server parle l'un des deux langages, choisi au démarrage pour toute l'instance :
- le langage MIRAJ (par défaut), décrit par les chapitres 6 à 10, 14 et 15 de ce manuel et par les chapitres thématiques qui suivent ;
- le langage PostgreSQL (élément
POSTGRESQLdesql_mode, voir 16.10) : le port parle alors le protocole et la grammaire de PostgreSQL, pourpsql, psycopg2, pgjdbc, Npgsql et les autres clients PostgreSQL. Il a son propre manuel, en syntaxe PostgreSQL : chapitres 32 à 41.
Le moteur, les fichiers de données, l'administration, le cluster et les sauvegardes sont les mêmes dans les deux cas. Les outils de MIRAJ (miraj-cli, miraj-dump, miraj-backup, miraj-migrate, les gestionnaires), le pilote ODBC et la bibliothèque Python miraj reconnaissent le langage de l'instance à la connexion. La prise en main montre le même exemple dans les deux langages.
1.3 Les éditions du produit#
MIRAJ est distribué en quatre éditions, produites à partir du même code :
| Édition | Parallélisme | Prix | Cas d'usage |
|---|---|---|---|
| Express | Chaque requête s'exécute sur un seul fil, sans parallélisme intra-requête ; 20 Go de données au plus (erreur 9005 au-delà pour les écritures qui font grossir les données). | Gratuite | Applications légères, développement, tests, petites charges. |
| Developer | Toutes les options de l'édition Cluster (réplication comprise), mais un seul cœur, 20 Go de données au plus (erreur 9011 au-delà pour les écritures qui font grossir les données) et 24 heures de fonctionnement : passé ce délai, toute instruction est refusée (erreur 9012) jusqu'au redémarrage du serveur. | Selon la licence | Développer et tester une application contre toutes les fonctions de MIRAJ, y compris le cluster ; ne convient pas à la production. |
| Entreprise | Les requêtes volumineuses (filtres, projections, agrégation, tri, DISTINCT, certaines jointures, lecture des écritures en masse) sont réparties sur plusieurs cœurs. | Payante | Charges de travail où la vitesse d'exécution des grosses requêtes compte. |
| Cluster | Entreprise, avec en plus la réplication multi-nœuds : un nœud primaire accepte les écritures, des nœuds secondaires reçoivent son journal et le rejouent en continu, en lecture seule ; une table partitionnée peut en outre ranger certaines partitions chez un seul nœud (§17.10). | Payante | Disponibilité en lecture, répartition de charge en lecture, préparation à un déploiement distribué. |
L'option MCP (assistants IA, chapitre 20) est disponible dans les éditions Entreprise, Cluster et Developer, pas dans Express. Il en va de même de la réplication par journal binaire au format de la référence (MIRAJ source ou réplica d'un serveur de la référence, chapitre 17, §17.13), distincte de la réplication de cluster. Le chiffrement des données au repos (chapitre 25) appartient aux seules éditions Entreprise et Cluster.
Les quatre éditions parlent le même SQL et lisent les mêmes fichiers de données ; seules la répartition du travail entre cœurs, le plafond de données des éditions Express et Developer, la durée de fonctionnement de l'édition Developer et la réplication changent.
Les éditions Entreprise et Cluster demandent une licence, un fichier miraj.lic vérifié sur la machine sans aucune connexion (chapitre 31). Sans licence valide, le serveur démarre quand même, avec les fonctions et les limites de l'édition Express.
Savoir quelle édition on utilise#
SELECT @@miraj_edition, @@version_comment, VERSION();+-----------------+------------------------------------+--------------------+
| @@miraj_edition | @@version_comment | VERSION() |
+-----------------+------------------------------------+--------------------+
| Entreprise | MIRAJ columnar engine (Entreprise) | 8.0.40-miraj-1.0.0 |
+-----------------+------------------------------------+--------------------+
1 ligne(s)@@miraj_edition vaut Entreprise, Express, Cluster ou Developer. SHOW ENGINES rappelle aussi l'édition dans le commentaire du moteur par défaut :
SHOW ENGINES;+--------+---------+-------------------------------------------------+--------------+-----+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------+---------+-------------------------------------------------+--------------+-----+------------+
| MIRAJ | DEFAULT | In-memory columnar storage (Entreprise edition) | YES | YES | YES |
| DISK | YES | Row storage on disk, indexes in memory | YES | YES | YES |
| Aria | YES | Alias of DISK | YES | YES | YES |
| MyISAM | YES | Alias of DISK | YES | YES | YES |
+--------+---------+-------------------------------------------------+--------------+-----+------------+
4 ligne(s)VERSION() rend le même numéro de version quelle que soit l'édition (8.0.40-miraj-1.0.0 : numéro de compatibilité puis version de MIRAJ, voir VERSION) ; c'est @@miraj_edition, @@version_comment et SHOW ENGINES qui distinguent Entreprise, Express, Cluster et Developer.
1.4 Aperçu de l'architecture#
Vu depuis l'extérieur, un moteur MIRAJ repose sur quatre principes :
- Stockage en colonnes, en mémoire. Chaque colonne d'une table est rangée séparément, avec un indicateur de valeur absente (
NULL) par colonne et une compression par dictionnaire ; les données travaillées par les requêtes résident en mémoire, le disque servant de support de durabilité. Pour les grosses tables peu consultées (historiques, archives), une table peut aussi être déclarée sur disque (ENGINE = Aria,MyISAMouDISK) : ses lignes restent dans son fichier et seuls ses index occupent la mémoire (voir Moteurs de stockage). - Journal d'écriture pour la durabilité. Toute écriture passe par un journal avant d'être considérée acquise ; des points de sauvegarde périodiques limitent le travail à rejouer après un arrêt brutal, qu'il s'agisse d'un arrêt du processus, d'une coupure de courant ou d'un arrêt du système.
- Exécution vectorisée. Les requêtes ne traitent pas les lignes une par une : elles opèrent par lots de plusieurs milliers de lignes à la fois, ce qui réduit le travail répété par ligne et tire parti du matériel moderne.
- Transactions. Chaque session peut travailler en transaction (
START TRANSACTION,COMMIT,ROLLBACK), avec un isolement sérialisable qui ne bloque jamais un lecteur en attente d'un écrivain.
Ce manuel reste à ce niveau : il ne détaille pas l'organisation interne du moteur (les couches internes, les formats binaires) au-delà de ce qui est utile pour l'exploiter, le configurer et l'administrer.
1.5 Sommaire du manuel#
- Introduction — ce document : modes d'utilisation, langages SQL, éditions, architecture, sommaire
- Installation — paquets Windows, macOS et Linux, assistant d'installation, options de
miraj-serveretmiraj-cli, fichier de configuration, dossier de données, sécurité par défaut - Prise en main — premier pas à pas dans les deux langages : serveur, connexion, base, tables, données, requêtes, jointures, transaction, index, schéma
- Comparatif des éditions — Express, Developer, Enterprise et Cluster côte à côte
- Notes de version — changements de chaque version, de la plus récente à la plus ancienne
- Types de données — entiers, décimaux exacts, flottants, chaînes, binaires et
BLOB, dates,ENUM/SET,JSON,UUID, colonnes dynamiques,VECTOR, conversions,DEFAULT,AUTO_INCREMENT, colonnes générées,CHECK - Langage DDL — bases, tables,
ALTER TABLE, index (dontFULLTEXTet trigrammes), vues, moteurs de stockage (tables en mémoire ou sur disque), partitionnement, clés étrangères, séquences, routines, maintenance des tables (CHECK,REPAIR,OPTIMIZE) - Langage DML —
INSERT,REPLACE,ON DUPLICATE KEY UPDATE,UPDATE,DELETE, requêtes paramétrées,PREPARE/EXECUTE,LOAD DATAetLOAD XML - Requêtes SELECT — jointures, agrégation, tri, sous-requêtes,
UNION/INTERSECT/EXCEPT,WITH, fenêtres, verrous de lecture,EXPLAIN, recherche plein texteMATCH … AGAINST - Fonctions SQL — chaînes, nombres, dates, contrôle, agrégats, expressions régulières, hachage et chiffrement, réseau, système, JSON, vecteurs, fenêtres, séquences, fonctions spatiales
- Recherche vectorielle —
VECTOR INDEX(HNSW), k plus proches voisins,mhnsw_ef_search,USING hnsw - Tables temporelles —
WITH SYSTEM VERSIONING,FOR SYSTEM_TIME AS OF | FROM … TO | BETWEEN | ALL,DELETE HISTORY, périodes applicatives (PERIOD FOR,FOR PORTION OF,WITHOUT OVERLAPS),PARTITION BY SYSTEM_TIME - Interclassements —
utf8mb4_general_ci,utf8mb4_unicode_ci,utf8mb4_bin: par colonne, table ou expression (COLLATE), coercibilité, erreurs 1253 / 1273 - Transactions et concurrence — autocommit, modèle de concurrence multiversion, mise à jour différée,
LOCK TABLES,SAVEPOINT, transactions XA - Comptes et privilèges — authentification,
CREATE/ALTER/DROP USER,GRANT/REVOKE, rôles, audit des droits - Administration du serveur — démarrage et arrêt, options, configuration, durabilité, sécurité (comptes, TLS), supervision, journaux, instance en langage PostgreSQL (16.10)
- Cluster et réplication — édition Cluster : primaire et secondaires, certificats, bascule, tables réparties entre nœuds ; réplication par journal binaire
- miraj-migrate — migration d'une base SQL existante vers MIRAJ
- Sauvegarde et restauration —
BACKUP/RESTOREà chaud, archivage continu du journal,miraj-backup, export SQLmiraj-dump - Serveur MCP — assistants IA sur MIRAJ :
--mcp ON, jetonsCREATE MCP TOKEN, niveauxSTRUCTURE/READ/WRITE/ADMIN, outils - Événements de changement —
LISTEN/NOTIFY/WAIT FOR CHANGES: être prévenu des écritures sans interroger la base, reprise après coupure, abonnés sur un nœud du cluster - Miraj Server Manager — gestionnaire graphique Windows et macOS : démarrage et arrêt, état, ressources, requêtes lentes, sauvegardes
- miraj-proxy — répartition de charge d'un cluster : port d'écriture vers le primaire, port de lecture vers le nœud le moins chargé, bascule, en-tête PROXY
- API REST — MIRAJ sur HTTP/HTTPS :
--rest ON, API écrites en SQL (CREATE ENDPOINT), tables, SQL libre, jetonsCREATE API TOKEN … ACCESS - Chiffrement au repos — éditions Entreprise et Cluster : dossier chiffré à l'initialisation, phrase secrète,
ENCRYPTIONpar base et par table,miraj-keyring, rotation de la clé - miraj-cli — référence de la console SQL : options, connexion à un serveur, commandes du mode interactif
- Bibliothèques clientes — API embarquée
miraj.dllet ses enveloppes (C#, Python, Java, PHP, Node.js, Go, C/C++, Delphi), bibliothèque Pythonmirajpour le serveur - Codes d'erreur — référence des codes et messages
- Pilote ODBC —
MIRAJ ODBC Drivernatif : installation (Windows, macOS, Linux), chaîne de connexion, DSN, Excel, Power BI, Access, LibreOffice, pyodbc, instance en langage PostgreSQL - Langage PostgreSQL — référence condensée de la grammaire d'une instance en langage PostgreSQL : lexique (
"x",E'…',$$…$$,$1), conversions::,ILIKE,FETCH FIRST,SET search_path, curseurs, extensions MIRAJ gardées, outils MIRAJ, pilote ODBC et bibliothèque Python sur une instance PostgreSQL - Licence des éditions Entreprise et Cluster — fichier
miraj.licvérifié sans connexion : installation (--install-license), titulaire (@@miraj_license_owner,SHOW LICENSE),FLUSH LICENSE, comportement sans licence ou à l'expiration, licence liée à une machine, une licence par cluster - PostgreSQL : Prise en main — démarrer l'instance, se connecter avec
psql,miraj-cliou un pilote, premier schéma - PostgreSQL : Types de données —
integer,numeric,text,bytea,timestamptz,interval,json/jsonb,uuid,vector, conversions::,serialet identité - PostgreSQL : Langage DDL — schémas et
search_path, tables, contraintes,ALTER TABLE, index, vues, séquences, commentaires - PostgreSQL : Langage DML —
INSERT,UPDATE … FROM,DELETE … USING,RETURNING,ON CONFLICT,TRUNCATE,COPY, paramètres - PostgreSQL : Requêtes SELECT — jointures, agrégats,
FETCH FIRST, opérations ensemblistes,WITH, fenêtres,FOR UPDATE,EXPLAIN - PostgreSQL : Fonctions SQL — opérateurs, chaînes, motifs, nombres, dates et intervalles,
to_char, agrégats, fenêtres, JSON, conversions, octets et hachage - PostgreSQL : Transactions et session —
BEGIN, points de sauvegarde, isolement,SET/SHOW/RESET,search_path, fuseau horaire, curseurs, transactions en deux phases - PostgreSQL : Comptes et privilèges — rôles,
GRANT/REVOKE, authentification SCRAM - PostgreSQL : Routines et déclencheurs (PL/pgSQL) — fonctions, procédures et
CALL, langage PL/pgSQL, messages et erreurs, déclencheurs - PostgreSQL : Catalogue et outils —
pg_catalog,information_schema,psql, pilotes, outils MIRAJ, sauvegarde