Maison base de données tutoriel mysql 用shell写的postgre数据库初始数据脚本

用shell写的postgre数据库初始数据脚本

Jun 07, 2016 pm 05:39 PM
shell

公司最近在使用postgresql数据库,开发给了我们很多ddl/dml语句,于是我就花了2天时间完成了这套脚本,用来创建表空间,用户,并且自动导入数据的脚本#!/bin/bas

公司最近在使用postgresql数据库,开发给了我们很多ddl/dml语句,于是我就花了2天时间完成了这套脚本,用来创建表空间,,用户,并且自动导入数据的脚本


#!/bin/bash # 2013/07/26, DD. # Usage: finshare_install_db.sh --dbname [ --userid ] [ --passwd ] [ --port ] [ --ctlfile ] [ --datadir ] [ -l ] [ --init ] [ --create ] [--help ] # FinShare DB SQL (DDL/DML) installation script for Postgre # postgre database install script # must use account postgres to login linux to run this script # must add account postgres to /etc/sudoers, and can execute mkdir、chown commands # must special one control file for this script, script will read this file to complete database initialization or execute DDL/DML script # Usage() { echo "Usage:" echo " $0 -d (to run DDL/DML script)" echo " $0 -d --create (to create a database)" echo " $0 -d --init -D (to initialize the database)" echo " " echo "Commands:" echo "Either long or short options are allowed." echo " -d, --dbname. database name" echo " -u, --userid. database user name, default is (postgres)" echo " -p, --passwd. user postgres's password" echo " -P, --port. database connection port, default is 5432" echo " -f, --ctlfile. control file. default is .ctl in current directory" echo " -l, --logdir. log file directory. default is /tmp" echo " -c, --cerate. if the database does not exist, add this parameter to create" echo " a database" echo " -i, --init. to initialize the database" echo " -D, --datadir. directory to store data" echo " -h, --help. print help information" echo " " if [ "X$1" != "X" ]; then echo $1 fi if [ "$help" == "true" ] then echo " Control file can have comment lines which start with # and empty lines." echo " if run script has special --init option, script will read lines start wiht (tablespace:) in control file to create table space and account, other lines will be temporary ignored. after finished create, it will execute in order. " echo " if cannot find lines start with tablespace: in control file, then it fails." echo " To initial database, use following line:" echo " tablespace:tablespaceName1:tablespaceName2:tablespaceName3:tablespaceName{n}:SchemaName" echo " if not special --init option, it will ignore lines start with (tablespace:), and then execute sql (DDL\DML)files in order." echo " each line can only contains two fields, if contains more fields ,then it fails." echo " To install ddl/dml, use following line:" echo " filePath:Schemaname" echo " If control file is not provided in -F, then it will find the file with extension .ctl" echo " in current directory. if there are more than one .ctl files, then it fails." echo " The control file directory is the scripts root directory." echo " Command is to run a single sql script. It is the line in control file for example." echo " the command script root directory is current directory." echo " " echo "Note:" echo " In control file, all directory path use / (don't use \)." echo " " fi exit 1 } func_CheckError() { sqlErrFound=0 if [ -n "`grep -E '^psql|^ERROR:|does not exist$|already exists$|No such file$' ${logfileTmp}`" ] then sqlErrFound=1 fi } func_PorcessCtl() { line=`echo $line | tr -d '\136\015\010'` if [ "X$line" != "X" ] then if [ "$1" == "yes" ] then params=`echo $line | awk -F: '{ for (i=2; i> $logfile 2>&1 #recreate current schema echo "***** create schema $schema" | tee -a $logfile $psqlCMD -h $hostname -p $port -d $dbname -U $userid -w -a -e -c "create schema $schema;" >> $logfile 2>&1 } func_createTabspa() { #change search_path to current schema totalspace=`expr $totalspace + 1` #echo "change $userid's default search_path to $schema" | tee -a $logfile #$psqlCMD -h $hostname -p $port -d $dbname -U $userid -w -a -e -c "ALTER ROLE $userid SET search_path to $schema;">>$logfile 2>&1 echo "***** create data directory $datadir/$tablespaceName" | tee -a $logfile sudo mkdir -p $datadir/$tablespaceName echo "***** change data directory ownership to $userid" sudo chown -R $userid:$userid $datadir/$tablespaceName echo "***** drop tablespace if already exists" $psqlCMD -h $hostname -p $port -d $dbname -U $userid -w -a -e -c "DROP TABLESPACE IF EXISTS $tablespaceName;" >> $logfile 2>&1 echo "***** create tablespace $tablespaceName" | tee -a $logfile $psqlCMD -h $hostname -p $port -d $dbname -U $userid -w -a -e -c "CREATE TABLESPACE $tablespaceName LOCATION '$datadir/$tablespaceName';" >> $logfile 2>&1 if [ $? -eq 0 ]; then echo "---------------------- $tablespaceName created" | tee -a $logfile else echo "---------------------- $tablespaceName create failed" | tee -a $logfile fi } func_changeSchema() { if [ "$1" == "yes" ] then echo "---------------------------------------------" | tee -a $logfile echo "change $userid's default search_path to $schema" | tee -a $logfile $psqlCMD -h $hostname -p $port -d $dbname -U $userid -w -a -e -c "ALTER ROLE $userid SET search_path to $schema;" >> $logfile 2>&1 else echo "---------------------------------------------" | tee -a $logfile echo "change default search_path back to public" | tee -a $logfile $psqlCMD -h $hostname -p $port -d $dbname -U $userid -w -a -e -c "ALTER ROLE $userid SET search_path to public;" >> $logfile 2>&1 fi } func_runSqlfile() { totalfiles=`expr $totalfiles + 1` echo "=== Executing file $filePath" | tee -a $logfile $psqlCMD -h $hostname -p $port -d $dbname -U $userid -w -a -e -f $filePath >> $logfileTmp 2>&1 errorSqlFile=$? func_CheckError if [ $errorSqlFile -ne 0 ] || [ $sqlErrFound -ne 0 ] then errfiles=`expr $errfiles + 1` echo "Error in $filePath" >> $logfileTmp echo "Error in $filePath. Check details in file - $logfile" fi if [ -f $logfileTmp ] then cat $logfileTmp >> $logfile rm -f $logfileTmp fi } func_createDatadir() { while true do read -p "Speciel the data directory: " datadir if [ -d $datadir ] then if [ `ls $datadir | wc -l` -ne 0 ] then echo "$datadir is already exist, but it is not empty" | tee -a $logfile echo "please select a another directory" else datadir=$datadir break fi else echo "create data directoy $datadir" | tee -a >> $logfile sudo mkdir -p $datadir break fi done } # ======================================== #echo Parsing command line arguments numargs=$# i=1 scriptname=`basename "$0"` scriptdir=`pwd "$0"` psqlCMD=psql createdbCMD=createdb hostname="localhost" initdb="no" createdb="no" help="false" dbname="" userid="" port="" controlfile="" controlcmd="" logdir="" if [ "$USER" == "root" ] then echo "User is "root", running this script must use "postgres"" exit 1 fi while [ $i -le $numargs ] do j=$1 if [ $j = "--dbname" ] || [ $j = "-d" ] then dbname=$2 shift 1 i=`expr $i + 1` fi if [ $j = "--userid" ] || [ $j = "-u" ] then userid=$2 shift 1 i=`expr $i + 1` fi if [ $j = "--ctlfile" ] || [ $j = "-f" ] then userid=$2 shift 1 i=`expr $i + 1` fi if [ $j = "--port" ] || [ $j = "-p" ] then port=$2 shift 1 i=`expr $i + 1` fi if [ $j = "--passwd" ] || [ $j = "-p" ] then port=$2 shift 1 i=`expr $i + 1` fi if [ $j = "--logfile" ] || [ $j = "-l" ] then logdir=$2 shift 1 i=`expr $i + 1` fi if [ $j = "--datadir" ] || [ $j = "-D" ] then datadir=$2 shift 1 i=`expr $i + 1` fi if [ $j = "--init" ] || [ $j = "-i" ] then initdb=yes fi if [ $j = "--create" ] || [ $j = "-c" ] then createdb=yes fi if [ $j = "--help" ] || [ $j = "-h" ] then help=true fi i=`expr $i + 1` shift 1 done if [ $help = "ture" ] then Usage fi if [ "X$dbname" == "X" ] then Usage "ERROR: dbname is empty." fi if [ "X$userid" == "X" ] then userid=postgres fi if [ "X$port" == "X" ] then port=5432 fi if [ "X$logdir" == "X" ] then logdir=/tmp else if [ ! -d $logdir ] then echo create log dirctory $logdir sudo mkdir -p $logdir fi fi logfile=$logdir/${scriptname}_${dbname}_`date +%Y-%m-%d_%H_%M_%S`.log logfileTmp=${logfile}.tmp if [ "X$pgpasswd" == "X" ] then while true do stty -echo read -p "Enter $userid's password: " PGPASSWORD stty echo if [ ! -z $PGPASSWORD ] || [ "X$PGPASSWORD" != "X" ] then export PGPASSWORD=$PGPASSWORD break fi done else export PGPASSWORD=$PGPASSWORD fi if [ "$createdb" == "yes" ] then echo -n "Special the owner of database $dbname, default user is "fscs": " read isFSCS echo "Special the owner of database $dbname, default user is "fscs": $isFSCS " >> $logfile if [ -z $isFSCS ] || [ "$isFSCS" == "X" ] then dbuser=fscs else dbuser=$isFSCS fi createuser -s $dbuser isCreate=$? if [ "$isCreate" -ne "0" ] then echo "create user $dbuser faied" exit 1 else echo User $dbuser created | tee -a $logfile fi $createdbCMD $dbname -O $dbuser isCreate=$? if [ $isCreate -eq 0 ] then echo The owner of the database $dbname is $dbuser | tee -a $logfile echo Database $dbname created | tee -a $logfile echo "------------------------------------------------" | tee -a $logfile echo "You can enter (y/Y) to initialize the $dbname database, enter any key to exit script" echo "Confrim there has initialize information in (*.ctl) control file" echo -n "Do you want to initialize the $dbname[y]: " read initial if [ "$initial" == "y" ] || [ "$initial" == "Y" ] then if [ "X$datadir" == "X" ] then func_createDatadir initdb=yes else datadir=$datadir fi else echo "You can use $0 -d $dbname --init to initialize the database" exit 0 fi else echo create database $dbname faied | tee -a $logfile echo check whether $dbname database is already exist or not? | tee -a $logfile exit 1 fi fi if [ $initdb = "yes" ] then if [ "X$datadir" == "X" ] then func_createDatadir else if [ -d $datadir ] then if [ `ls $datadir | wc -l` -ne 0 ] then echo "$datadir is already exist, and it is not empty" | tee -a $logfile exit 1 fi else echo "create data directoy $datadir" | tee -a >> $logfile sudo mkdir -p $datadir fi fi fi if [ "X$controlfile" == "X" ] then cnt=0 for f in *.ctl do if [ "X$f" != "X" ] && [ "$f" != "*.ctl" ] then cnt=`expr $cnt + 1` fi done if [ $cnt -eq 0 ] then Usage "ERROR: There is no control file (.ctl) in current directory." elif [ $cnt -eq 1 ] then controlfileDir=`pwd` controlfile=$controlfileDir/$f else Usage "ERROR: There are more than one control files (.ctl) in current directory." fi else if [ -f $controlfile ] then controlfileDir=`dirname $controlfile` controlfile=$controlfileDir/`basename $controlfile` fi fi echo log file: $logfile echo FinShare SQL installation starts at `date +%Y-%m-%d.%H:%M:%S` | tee -a $logfile echo Premium Technology Inc. | tee -a $logfile echo Postgres database name: $dbname | tee -a $logfile echo Postgres database User: $userid | tee -a $logfile echo Postgres database port: $port | tee -a $logfile echo SQL Scripts Root Directory: $scriptdir | tee -a $logfile echo Control file full path: $controlfile | tee -a $logfile totalschema=0 totalspace=0 totalfiles=0 errfiles=0 readline=`cat $controlfile | grep -v "^#" | grep -v "^$"` if [ $initdb = "yes" ] then isTablespace=`echo "$readline" | grep -i "^tablespace:"` if [ $? -eq 0 ] then for AllspaceName in $readline do line=$AllspaceName func_PorcessCtl $initdb done else echo No tablesapce defined in $controlfile | tee -a $logfile echo for example: TABLESPACE:tablespaceName1:tablespaceName2:tablespaceName[n]:CDA | tee -a $logfile exit 1 fi initdb=no fi if [ $initdb = "no" ] then sqlname=`cat $controlfile | grep -v "^#" | grep -v "^$" | grep -v -i "^tablespace:"` if [ "X$sqlname" == "X" ] then echo "Error: No SQL file defined in $controfile" | tee -a $logfile exit 1 fi for i in $sqlname do line=$i func_PorcessCtl $initdb done fi echo "finished at `date +%Y-%m-%d.%H:%M:%S`" | tee -a $logfile if [ $totalspace -ne 0 ] then echo $totalspace tablespace have been created | tee -a $logfile fi if [ $totalschema -ne 0 ] then echo $totalschema database user have been created | tee -a $logfile fi echo "$totalfiles files have been executed" | tee -a $logfile echo "$errfiles files with errors" | tee -a $logfile echo "Check log file: $logfile"


本文出自 “一步一步” 博客,谢绝转载!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Où trouver la courte de la grue à atomide atomique
1 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment installer Classic Shell sur Windows 11 ? Comment installer Classic Shell sur Windows 11 ? Apr 21, 2023 pm 09:13 PM

<p>La personnalisation de votre système d'exploitation est un excellent moyen de rendre votre vie quotidienne plus agréable. Vous pouvez modifier l'interface utilisateur, appliquer des thèmes personnalisés, ajouter des widgets, etc. Aujourd’hui, nous allons vous montrer comment installer ClassicShell sur Windows 11. </p><p>Ce programme existe depuis longtemps et vous permet de modifier le système d'exploitation. Des bénévoles ont désormais commencé à diriger l’organisation, qui a été dissoute en 2017. Le nouveau projet s'appelle OpenShell et est actuellement disponible sur Github pour les personnes intéressées. </p>&a

Explorer.exe ne démarre pas au démarrage du système [Réparer] Explorer.exe ne démarre pas au démarrage du système [Réparer] Jun 03, 2023 am 08:31 AM

De nos jours, de nombreux utilisateurs de Windows commencent à rencontrer de graves problèmes avec le système Windows. Le problème est qu'Explorer.exe ne peut pas démarrer une fois le système chargé et les utilisateurs ne peuvent pas ouvrir de fichiers ou de dossiers. Cependant, les utilisateurs Windows peuvent ouvrir l'Explorateur Windows manuellement à l'aide de l'invite de commande dans certains cas et cela doit être fait à chaque redémarrage du système ou après le démarrage du système. Cela peut être problématique et est dû aux facteurs suivants mentionnés ci-dessous. Fichiers système corrompus. Activez les paramètres de démarrage rapide. Pilotes d’affichage obsolètes ou problématiques. Des modifications ont été apportées à certains services du système. Fichier de registre modifié. En gardant à l'esprit tous les facteurs ci-dessus, nous en avons proposé quelques-uns qui aideront sûrement les utilisateurs.

Le déploiement PowerShell échoue avec le problème HRESULT 0x80073D02 résolu Le déploiement PowerShell échoue avec le problème HRESULT 0x80073D02 résolu May 10, 2023 am 11:02 AM

Voyez-vous ce message d'erreur « Add-AppxPackage : Le déploiement a échoué avec HRESULT : 0x80073D02, Le package ne peut pas être installé car la ressource qu'il modifie est actuellement en cours d'utilisation. Erreur 0x80073D02... » dans PowerShell lorsque vous exécutez le script ? Comme l'indique le message d'erreur, cela se produit lorsque l'utilisateur tente de réenregistrer une ou toutes les applications WindowsShellExperienceHost pendant l'exécution du processus précédent. Nous avons quelques solutions simples pour résoudre ce problème rapidement. Correctif 1 – Terminez le processus hôte d’expérience que vous devez terminer avant d’exécuter la commande PowerShell

Comment supprimer rapidement la ligne à la fin d'un fichier sous Linux Comment supprimer rapidement la ligne à la fin d'un fichier sous Linux Mar 01, 2024 pm 09:36 PM

Lors du traitement de fichiers sous les systèmes Linux, il est parfois nécessaire de supprimer des lignes à la fin du fichier. Cette opération est très courante dans les applications pratiques et peut être réalisée grâce à quelques commandes simples. Cet article présentera les étapes pour supprimer rapidement la ligne à la fin du fichier dans le système Linux et fournira des exemples de code spécifiques. Étape 1 : Vérifiez la dernière ligne du fichier Avant d'effectuer l'opération de suppression, vous devez d'abord confirmer quelle ligne est la dernière ligne du fichier. Vous pouvez utiliser la commande tail pour afficher la dernière ligne du fichier. La commande spécifique est la suivante : tail-n1filena.

Différentes façons d'exécuter des fichiers de script shell sous Windows Différentes façons d'exécuter des fichiers de script shell sous Windows Apr 13, 2023 am 11:58 AM

Sous-système Windows pour Linux La première option consiste à utiliser le sous-système Windows pour Linux ou WSL, qui est une couche de compatibilité permettant d'exécuter les exécutables binaires Linux de manière native sur les systèmes Windows. Il fonctionne pour la plupart des scénarios et vous permet d'exécuter des scripts shell sous Windows 11/10. WSL n'est pas automatiquement disponible, vous devez donc l'activer via les paramètres de développement de votre appareil Windows. Vous pouvez le faire en allant dans Paramètres > Mise à jour et sécurité > Pour les développeurs. Passez en mode développeur et confirmez l'invite en sélectionnant Oui. Ensuite, cherchez W

Voici les correctifs pour le problème de non-fonctionnement d'Open Shell Windows 11 Voici les correctifs pour le problème de non-fonctionnement d'Open Shell Windows 11 Apr 14, 2023 pm 02:07 PM

Le shell ouvert qui ne fonctionne pas sous Windows 11 n’est pas un problème nouveau et tourmente les utilisateurs depuis l’avènement de ce nouveau système d’exploitation. La cause du problème de non-fonctionnement d’Open-Shell Windows 11 n’est pas spécifique. Cela peut être dû à des erreurs inattendues dans les programmes, à la présence de virus ou de logiciels malveillants ou à des fichiers système corrompus. Pour ceux qui ne le savent pas, Open-Shell remplace Classic Shell, qui a été abandonné en 2017. Vous pouvez consulter notre tutoriel sur la façon d'installer Classic Shell sur Windows 11. Comment remplacer le menu Démarrer de Windows 11

Super hardcore ! 11 exemples de scripts Python et Shell très pratiques ! Super hardcore ! 11 exemples de scripts Python et Shell très pratiques ! Apr 12, 2023 pm 01:52 PM

Quelques exemples de scripts Python : alarmes WeChat d'entreprise, clients FTP, clients SSH, clients Saltstack, clients vCenter, obtention du délai d'expiration du certificat SSL du nom de domaine, envoi des prévisions météo du jour et des graphiques de tendances météorologiques futures ; quelques exemples de scripts Shell : sauvegarde complète SVN, Zabbix surveille l'expiration des mots de passe des utilisateurs, construit YUM local et les besoins des lecteurs sont mentionnés dans l'article précédent (lorsque la charge est élevée, recherchez les scripts de processus qui occupent une quantité plus élevée et stockent ou envoient des notifications, donc c'est un peu long) ; veuillez le lire patiemment. À la fin de l'article, il y a un œuf de Pâques après tout. Script Python faisant partie de l'alarme WeChat d'entreprise Ce script utilise l'application WeChat d'entreprise pour exécuter l'alarme WeChat et peut être utilisé

Comment installer Open Shell pour restaurer le menu Démarrer classique sur Windows 11 Comment installer Open Shell pour restaurer le menu Démarrer classique sur Windows 11 Apr 18, 2023 pm 10:10 PM

OpenShell est un utilitaire logiciel gratuit qui peut être utilisé pour personnaliser le menu Démarrer de Windows 11 pour qu'il ressemble à un menu de style classique ou à un menu de style Windows 7. Le menu Démarrer des versions précédentes de Windows offrait aux utilisateurs un moyen simple de parcourir le contenu de leur système. Fondamentalement, OpenShell remplace ClassicShell qui fournit différents éléments d'interface utilisateur qui permettent d'obtenir les fonctionnalités de cette dernière version à partir des versions précédentes de Windows. Une fois le développement de ClassicShell arrêté en 2017, il a été maintenu et développé par des bénévoles de GitHub sous le nom d'OpenShell. C'est lié à Win

See all articles