Le moyen le plus rapide de démarrer avec SQL Server consiste à utiliser les conteneurs Docker disponibles. J’utilise le didacticiel suivant pour déployer SQL Server sur Ubuntu à partir de mon Mac. Mon SQL Server-Fu est un peu rouillé et j’ai opté pour suivre ce tutoriel pour restaurer WideWordImporters
exemple de base de données dans mon conteneur Docker. Vous pouvez également avoir besoin d’outils SQL Server installés sur votre hôte et vous pouvez trouver des instructions pour Mac OS et Linux sur le site suivant, les utilisateurs de Windows sont assez familiers avec un emplacement de téléchargement pour leur système d’exploitation.
J’ai également utilisé les instructions suivantes pour installer les outils SQL Server sur mon Mac, mais j’ai rencontré des problèmes de compatibilité avec les pilotes de mon conteneur Docker. Ce sera une session de débogage pour un autre jour.
Exécuter SQL Server dans Docker
Extrayez l’image SQL Server :
docker pull mcr.microsoft.com/mssql/server:2019-GA-ubuntu-16.04
Exécutez le conteneur :
docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=Cockroach!1' -p 1433:1433 --name sql1 -d mcr.microsoft.com/mssql/server:2019-GA-ubuntu-16.04
Changer le mot de passe:
docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'Cockroach!1' -Q 'ALTER LOGIN SA WITH PASSWORD="CockroachDB1!"'
Restaurer un fichier de sauvegarde de la base de données WideWorldImporters dans le conteneur
Créez un répertoire de sauvegarde :
docker exec -it sql1 mkdir /var/opt/mssql/backup
Télécharger la base de données WideWorldImporters :
curl -L -o wwi.bak 'https://github.com/Microsoft/sql-server-samples/releases/download/wide-world-importers-v1.0/WideWorldImporters-Full.bak'
Copiez le fichier de sauvegarde dans le conteneur :
docker cp wwi.bak sql1:/var/opt/mssql/backup
Répertoriez les noms et chemins logiques de la sauvegarde :
docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'CockroachDB1!' -Q 'RESTORE FILELISTONLY FROM DISK = "/var/opt/mssql/backup/wwi.bak"' | tr -s ' ' | cut -d ' ' -f 1-2
Exécutez la commande de restauration :
docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'CockroachDB1!' -Q 'RESTORE DATABASE WideWorldImporters FROM DISK = "/var/opt/mssql/backup/wwi.bak" WITH MOVE "WWI_Primary" TO "/var/opt/mssql/data/WideWorldImporters.mdf", MOVE "WWI_UserData" TO "/var/opt/mssql/data/WideWorldImporters_userdata.ndf", MOVE "WWI_Log" TO "/var/opt/mssql/data/WideWorldImporters.ldf", MOVE "WWI_InMemory_Data_1" TO "/var/opt/mssql/data/WideWorldImporters_InMemory_Data_1"'
Vérifiez la base de données restaurée :
docker exec -it sql1 /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'CockroachDB1!' -Q 'SELECT Name FROM sys.Databases'
Accédez au conteneur Docker SQL Server à partir de votre hôte à l’aide de mssql-cli
mssql-cli est un utilitaire CLI utilisé pour se connecter à SQL Server. Il est actuellement en plein développement et offre une expérience plus agréable sur sqlcmd
, À mon avis. Dans la nouvelle mode typique de Microsoft, la page GitHub du projet peut être trouvée ici. Il est également plus facile à installer que sqlcmd
sur mon Mac.
Installez l’outil mssql-cli sur votre hôte :
sudo pip install mssql-cli
Dans mon cas, l’installation échoue à cause du package six
étant disponible sur mon système, la solution de contournement est donc :
sudo pip install mssql-cli --ignore-installed six
Connectez-vous directement à votre instance SQL Server :
mssql-cli -U SA -P 'CockroachDB1!' -S localhost,1433 -d WideWorldImporters
Exécutez un exemple de requête :
SELECT StockItemID, StockItemName FROM WideWorldImporters.Warehouse.StockItems WHERE StockItemID>=1
Rediriger la sortie d’une requête vers un fichier que nous allons utiliser pour l’importation dans CockroachDB :
mssql-cli -U SA -P 'CockroachDB1!' -S localhost,1433 -d WideWorldImporters -Q "SELECT * FROM WideWorldImporters.Warehouse.StockItemTransactions" -o StockItemTransactions.csv
Utiliser l’utilitaire BCP pour l’exportation en bloc
bcp
est un utilitaire de copie en bloc qui est mieux servi pour exporter des données hors de SQL Server Vous pouvez essayer d’installer sqlcmd
et mssqlodbc
localement ou connectez-vous au conteneur et utilisez bcp
qui est fourni avec SQL Server. D’après mon expérience, la mise en place bcp
avec brew
sur OSX était un défi, et j’ai plutôt choisi de l’exécuter dans un conteneur.
docker exec -it sql1 bash /opt/mssql-tools/bin/bcp WideWorldImporters.Warehouse.StockItemTransactions out /var/opt/mssql/backup/StockItemTransactionsBCP.csv -S localhost,1433 -U sa -P 'CockroachDB1!' -c -t',' -r'n'
Copiez le fichier sur votre hébergeur :
docker cp sql1:/var/opt/mssql/backup/StockItemTransactionsBCP.csv .
Décris StockItemTransactions
table un équivalent de describe tablename
dans SQL Server est une procédure stockée ci-dessous :
exec sp_columns StockItemTransactions
La sortie est longue, il est donc préférable de la sortir dans un fichier
mssql-cli -U SA -P 'CockroachDB1!' -S localhost,1433 -d WideWorldImporters -Q "exec sp_columns StockItemTransactions" -o schema.sql
+--------------------+---------------+-----------------------+-------------------------+-------------+-------------+-------------+----------+---------+---------+------------+-----------+----------------------------------------------+-----------------+--------------------+---------------------+--------------------+---------------+----------------+ | TABLE_QUALIFIER | TABLE_OWNER | TABLE_NAME | COLUMN_NAME | DATA_TYPE | TYPE_NAME | PRECISION | LENGTH | SCALE | RADIX | NULLABLE | REMARKS | COLUMN_DEF | SQL_DATA_TYPE | SQL_DATETIME_SUB | CHAR_OCTET_LENGTH | ORDINAL_POSITION | IS_NULLABLE | SS_DATA_TYPE | |--------------------+---------------+-----------------------+-------------------------+-------------+-------------+-------------+----------+---------+---------+------------+-----------+----------------------------------------------+-----------------+--------------------+---------------------+--------------------+---------------+----------------| | WideWorldImporters | Warehouse | StockItemTransactions | StockItemTransactionID | 4 | int | 10 | 4 | 0 | 10 | 0 | NULL | (NEXT VALUE FOR [Sequences].[TransactionID]) | 4 | NULL | NULL | 1 | NO | 56 | | WideWorldImporters | Warehouse | StockItemTransactions | StockItemID | 4 | int | 10 | 4 | 0 | 10 | 0 | NULL | NULL | 4 | NULL | NULL | 2 | NO | 56 | | WideWorldImporters | Warehouse | StockItemTransactions | TransactionTypeID | 4 | int | 10 | 4 | 0 | 10 | 0 | NULL | NULL | 4 | NULL | NULL | 3 | NO | 56 | | WideWorldImporters | Warehouse | StockItemTransactions | CustomerID | 4 | int | 10 | 4 | 0 | 10 | 1 | NULL | NULL | 4 | NULL | NULL | 4 | YES | 38 | | WideWorldImporters | Warehouse | StockItemTransactions | InvoiceID | 4 | int | 10 | 4 | 0 | 10 | 1 | NULL | NULL | 4 | NULL | NULL | 5 | YES | 38 | | WideWorldImporters | Warehouse | StockItemTransactions | SupplierID | 4 | int | 10 | 4 | 0 | 10 | 1 | NULL | NULL | 4 | NULL | NULL | 6 | YES | 38 | | WideWorldImporters | Warehouse | StockItemTransactions | PurchaseOrderID | 4 | int | 10 | 4 | 0 | 10 | 1 | NULL | NULL | 4 | NULL | NULL | 7 | YES | 38 | | WideWorldImporters | Warehouse | StockItemTransactions | TransactionOccurredWhen | -9 | datetime2 | 27 | 54 | NULL | NULL | 0 | NULL | NULL | -9 | NULL | NULL | 8 | NO | 0 | | WideWorldImporters | Warehouse | StockItemTransactions | Quantity | 3 | decimal | 18 | 20 | 3 | 10 | 0 | NULL | NULL | 3 | NULL | NULL | 9 | NO | 55 | | WideWorldImporters | Warehouse | StockItemTransactions | LastEditedBy | 4 | int | 10 | 4 | 0 | 10 | 0 | NULL | NULL | 4 | NULL | NULL | 10 | NO | 56 | | WideWorldImporters | Warehouse | StockItemTransactions | LastEditedWhen | -9 | datetime2 | 27 | 54 | NULL | NULL | 0 | NULL | (sysdatetime()) | -9 | NULL | NULL | 11 | NO | 0 | +--------------------+---------------+-----------------------+-------------------------+-------------+-------------+-------------+----------+---------+---------+------------+-----------+----------------------------------------------+-----------------+--------------------+---------------------+--------------------+---------------+----------------+ (11 rows affected)
Importer des données de SQL Server dans CockroachDB
Démarrez une instance à nœud unique de Cockroach ou utilisez votre propre environnement :
cockroach start-single-node --insecure --host=localhost --port=26257 --background --external-io-dir $PWD
Remarque : actuellement, Cockroach ne prend pas en charge les schémas, nous allons donc placer la table dans le schéma par défaut.
Cet article couvre une ancienne version de CockroachDB et dans les versions récentes, nous avons ajouté la prise en charge des schémas personnalisés.
select * from stockitemtransactions where supplierid is not null;
Importer la sortie de bcp
De SQL Server à CockroachDB
Connectez-vous à votre instance de CockroachDB SQL Shell :
cockroach sql --insecure
Importez l’ensemble de données :
root@:26257/defaultdb> CREATE DATABASE IF NOT EXISTS WideWorldImporters; USE WideWorldImporters; DROP TABLE IF EXISTS StockItemTransactions; IMPORT TABLE StockItemTransactions ( StockItemTransactionID INT8 NOT NULL, StockItemID INT8 NOT NULL, TransactionTypeID INT8 NOT NULL, CustomerID STRING NULL, --INT8 InvoiceID STRING NULL, --INT8 SupplierID STRING NULL, --INT8 PurchaseOrderID STRING NULL, --INT8 TransactionOccurredWhen TIMESTAMP NOT NULL, Quantity DECIMAL NOT NULL, LastEditedBy INT8 NOT NULL, LastEditedWhen TIMESTAMP NOT NULL ) CSV DATA ('nodelocal:///StockItemTransactionsBCP.csv'); CREATE DATABASE Time: 572µs SET Time: 196µs DROP TABLE Time: 76.272ms job_id | status | fraction_completed | rows | index_entries | system_records | ...