2011-06-05 1 views
10

Je souhaite installer postgresql en tant que backend pour une application Windows.Des instances indépendantes de Postgresql sont-elles possibles?

Cela ne semble pas poser de problème si postgresql n'est pas déjà installé sur le système.

Si postgresql est déjà installé, à moins que les paramètres de ligne de commande ne contiennent le mot de passe supérieur de l'installation existante, l'installation échoue. Comme je ne connaîtrai probablement jamais le super mot de passe ou d'autres détails de compte d'une instance postgresql préexistante et que les propriétaires de la machine ne semblent pas non plus gêner toute tentative d'installation de postgresql dans une telle situation.

Je crois qu'il est possible d'installer des instances complètement indépendantes de sql server mais est-ce possible pour postgresql?

BTW: Si la ligne de commande contient la superpassword correcte, l'installation semble juste pour remplacer l'installation existante et ne tient pas compte des paramètres tels que prefix etc. J'ai utilisé init db pour créer un nouveau cluster de base de données avant d'effectuer une seconde installation, mais ce nouveau cluster a été ignoré?

+0

Si vous pensez qu'il ya un bug dans l'un clic de EnterpriseDB Installer (qui est le programme d'installation que vous utilisez, à droite?), Alors il est préférable de demander à leur [soutien forum] (http://forums.enterprisedb.com/forums/show/9.page). –

+0

@Milen Je n'ai aucune raison de penser qu'il y a un bug. Je pense juste que des instances indépendantes de postgresql peuvent ne pas être possibles mais j'espère que je me trompe, mais je vais regarder dans leur forum, merci pour l'info – jjb

+0

Selon votre description (j'essaie actuellement de reproduire le comportement) ça sonne comme un bogue - le programme d'installation ne doit pas ignorer votre argument "--prefix". –

Répondre

3

Quelque chose comme cela devrait fonctionner (sinon il est probablement bug):

postgresql-9.0.4-1-windows_x64.exe^
    --mode unattended^
    --prefix c:\postgres\9.0-second^
    --servicename postgresql-x64-9.0-second^
    --serviceaccount postgres2^
    --servicepassword <password>^
    --serverport 5433^
    --superaccount postgres^
    --superpassword <password> 

EDIT: après quelques tests, je crois qu'il est impossible de créer différentes instances de Postgres de la même version en utilisant One -click installateur. Pardon. OTOH vous pouvez toujours jouer avec initdb et pg_ctl et utiliser l'installation existante pour créer une nouvelle instance. Ce ne serait pas aussi simple que de démarrer l'installateur, mais c'est faisable.

+0

Salut Milen, ça marche comme ça ne donne pas d'erreur à l'installation mais aucun dossier tel que spécifié dans le --prefix n'est créé et aucun service de ce nom ne fonctionne selon l'onglet services dans le gestionnaire de tâches Windows. Donc, même si une installation se produit comme en témoignent les barres de progression rien n'est changé – jjb

+2

Malheureusement oui, j'ai observé la même chose - s'il y a une installation existante de la même version, le programme d'installation va simplement ignorer les options. –

+2

Je suis prêt à apprendre à utiliser initdb etc mais le principal problème pour moi est que je crois que la connaissance d'un super-mot de passe préexistant semble être nécessaire. Ce ne sera pas disponible pour moi et peut ne pas être connu des clients. J'espérais qu'il pourrait être possible de créer une installation indépendante avec son propre superpassword uniquement pour notre application. Je pense que peut-être SQL Server Express peut être un meilleur pari à cause de cela. Je crois qu'il permet à des instances complètement indépendantes d'être installées – jjb

11

En général, vous pouvez avoir plusieurs instances indépendantes de PostgreSQL. Strictement parlant, il est groupe de base de données avec séparée:

  • configuration du répertoire des données
  • (par exemple postgresql.conf, pg_hba.conf)
  • écoute le port TCP/UDP (par défaut 5432+)
  • utilisateur propriétaire et le rôle super-utilisateur
  • paramètres régionaux et codage par défaut
  • fichier journal
  • processus serveur postmaster (sur Windows postgres.exe)

exemple bien fait parfait est Debian facile à utiliser postgresql-common infrastructures (pg_ctlcluster, pg_lsclusters, pg_createcluster, pg_dropcluster, inclus SSL, la rotation du journal et ainsi de suite).

EDIT:

Je l'ai trouvé est assez facile à installer deuxième, troisième, etc.instance de même PostgreSQL versionné sous Windows avec EnterpriseDB's installer, pas besoin d'utiliser initdb et pg_ctl (en supposant l'installation 64 bits, probablement vous devez utiliser Program Files (x86) pour l'installation 32 bits):

  1. Ouvrir cmd avec des privilèges d'administrateur (Exécuter en tant qu'administrateur)
  2. Execute: cd "C:\Program Files\PostgreSQL\9.0\installer\server"
  3. Créer un nouveau groupe de base de données (appuyez sur Entrée sur chaque étape): initcluster.vbs postgres postgres 12345 "C:\Program Files\PostgreSQL\9.0" "C:\Program Files\PostgreSQL\9.0\data2" 5433 DEFAULT
  4. Registre que Windows Service: startupcfg.vbs 9.0 postgres 12345 "C:\Program Files\PostgreSQL\9.0" "C:\Program Files\PostgreSQL\9.0\data2" postgresql-x64-9.0-2
  5. Run service nouvellement créé à l'aide postgresql-x64-9.0-2services.msc et vous avez deuxième serveur

Modifier 12345 à votre mot de passe spécifié lors de l'installation PostgreSQL. Vous n'avez pas besoin d'utiliser le répertoire data2, utilisez ce que vous voulez (mais bien sûr pas le répertoire data existant).

+4

parfait ajouter vrai à la fin du script à l'étape 3. C'est la vérification ACL ajouté dans la version postgres plus récente. –

+2

Après l'étape 4, il n'apparaît pas dans la liste des services –

+0

@ValentinKuzub: J'ai dû utiliser '" NT Authority \ NetworkService "' comme nom d'utilisateur (avec mot de passe vide) à l'étape 4, puis la nouvelle instance est apparue dans la liste des services. – Martijn

4

Sur Windows 7, j'ai eu du succès en suivant ces étapes. Vous aurez besoin de l'utilitaire PsExec.exe disponible dans le Sysinternals Suite. Je suppose ici que le chemin vers la Suite Sysinternals et le chemin vers le dossier bin de votre installation PostgreSQL existante sont dans votre variable d'environnement PATH.

  1. Ouvrez une fenêtre cmd.exe et entrez la commande suivante pour ouvrir une invite en tant que compte de service réseau.

    psexec -i -u "nt authority\network service" cmd.exe

  2. Le compte de service réseau ne sera pas avoir accès à votre PATH, afin cd 'C:\PostgreSQL\9.3\bin' puis entrez la commande suivante pour initialiser un répertoire de données pour votre nouvelle instance. J'ai appelé le mien "data2". Il ne doit pas nécessairement se trouver dans le répertoire postgres, mais c'est là que se trouve le répertoire de données par défaut, c'est donc un choix raisonnable.

    initdb "C:\PostgreSQL\9.3\data2"

  3. Modifier C: \ PostgreSQL \ 9.3 \ données2 \ postgresql.conf afin que port = 5433 (l'instance par défaut utilise 5432, et vous ne devriez pas avoir deux instances sur le même port)

  4. Laissez l'invite cmd du service réseau et, dans votre invite standard, entrez la commande suivante pour enregistrer le nouveau service. Ici, je l'ai appelé mon nouvelle instance "pg_test"

    pg_ctl register -N pg_test -U "nt authority\network service" -D "C:\PostgreSQL\9.3\data2"

  5. Exécutez la commande suivante pour démarrer le service.

    net start pg_test

  6. La base de données rôle de propriétaire sera «YOURMACHINENAME $. Si vous voulez changer cela en standard 'postgres', vous devez d'abord créer un nouveau rôle de super utilisateur qui peut renommer le propriétaire. À l'invite de commande, entrez ce qui suit pour créer ce super-utilisateur.

    createuser -s -r -l -i -P -h localhost -p 5433 -U YOURMACHINENAME$ mysuperuser

  7. Enfin, se connecter au serveur avec psql (psql -U mysuperuser -h localhost -p 5433 postgres) et entrez les commandes suivantes pour renommer le propriétaire de votre base de données et ajouter un mot de passe.

    ALTER USER "YOURMACHINENAME$" RENAME TO postgres;

    ALTER USER postgres WITH PASSWORD 'yourpassword';

Questions connexes