IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration PostgreSQL Discussion :

pg_basebackup : message d'erreur inadéquat? [11]


Sujet :

Administration PostgreSQL

  1. #1
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 001
    Points : 2 505
    Points
    2 505
    Par défaut pg_basebackup : message d'erreur inadéquat?
    Salut les experts,
    Je suis sous Windows, psql 14.0 et, quand j'utilise pg_basebackup, j'ai un message d'erreur que je pense innaproprié...

    Voici ce que je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    F:\00000 Applications\PostgreSQL\bin>pg_basebackup --format=tar --wal-method=stream --checkpoint=fast --progress -h 127.0.0.1 -U sauve -D F:\00000\backups\
    Mot de passe :
    Mot de passe :
    46214/46214 Ko (100%), 1/1 tablespace
    pg_basebackup: erreur : n'a pas pu ouvrir le fichier « F:\00000\backups\ » : No such file or directory

    J'ai pourtant trois fichiers générés dans F:\00000\backups, non vides :
    backup_manifest
    base.tar
    pg_wal.tar

    Si j'ouvre backup_manifest, je lis (j'ai fais une sélection début-fin) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    { "PostgreSQL-Backup-Manifest-Version": 1,
    "Files": [
    { "Path": "backup_label", "Size": 228, "Last-Modified": "2022-04-29 07:35:44 GMT", "Checksum-Algorithm": "CRC32C", "Checksum": "4068c44c" },
    ...
    ...
    ...
    { "Path": "global/pg_control", "Size": 8192, "Last-Modified": "2022-04-29 07:35:33 GMT", "Checksum-Algorithm": "CRC32C", "Checksum": "43872087" }
    ],
    "WAL-Ranges": [
    { "Timeline": 1, "Start-LSN": "0/12000028", "End-LSN": "0/12000138" }
    ],
    "Manifest-Checksum": "a48c7edc9e9e59c1c48af5603b64ec577def9ec3842910d81f902a4922bf5b0c"}

    Ma question est : est-ce que le message d'erreur ci-dessus est pertinent ou non?

    Merci pour vos retours :-)

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 735
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 735
    Points : 31 060
    Points
    31 060
    Billets dans le blog
    1
    Par défaut
    Salut
    Citation Envoyé par Ikebukuro Voir le message
    Salut les experts,
    Oups...

    Citation Envoyé par Ikebukuro Voir le message
    Je suis sous Windows, psql 14.0 et, quand j'utilise pg_basebackup, j'ai un message d'erreur que je pense innaproprié...
    En général, tout message d'erreur exprime un souci. Il est possible que ce souci soit négligeable.

    Citation Envoyé par Ikebukuro Voir le message
    Ma question est : est-ce que le message d'erreur ci-dessus est pertinent ou non?
    J'en sais rien. Mais j'ai des idées...
    Idée 1: le message d'erreur peut provenir du fait que tu nommes spécifiquement le disque "F:" dans ton dossier. Il se peut que la commande n'aime pas cette spécification.
    Vu que tu es déjà sous F:, tu peux essayer la même commande sans ça => pg_basebackup ... -D \00000\backups ou même pg_basebackup ... -D backups si tu es déjà dans le dossier "00000"
    Idée n° 2: regarder le contenu du tar
    Idée n° 3: compter toutes les lignes de toutes tes bdd. Faire ton pg_backup mais pas au format "tar", au format standard. Tu te retrouves avec un dossier clône du dossier data de Postgres.
    Ensuite tu arrêtes l'instances, tu changes le PGDATA pour qu'il pointe vers ce dossier clône puis tu relances l'instance et tu re-comptes toutes les lignes de toutes tes bdd. Et tu regardes si le nombre est le même
    Si tu veux tu peux utiliser ce programme Python qui compte toutes les lignes de toutes les tables d'une bdd Postgres
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    #!/usr/bin/env python3
    # coding: utf-8
     
    # Usage: prog [-h, --host=host] [-p, --port=port] [-U, --user=user] [-P, --password=password] [--config=file] [-?] bdd [bdd ...]
    #	Option -h, --host=host: Connexion sur le serveur host
    #	Option -p, --port=port: Connexion sur le port port
    #	Option -U, --user=user: Connexion avec l'utilisateur user
    #	Option -P, --password=password: Connexion avec le mot de passe
    #	Option --config=file: Utilisation du fichier de configuration file
    #	Option -?, --help: Utilisation de ce programme
     
    # Modules Python
    import sys				# Paramètres et fonctions systèmes
    import os				# Gestion os
    import getopt				# Gestion options Posix
    import psycopg2				# Accès PostgreSQL
    import psycopg2.extras			# Goodies PostgreSQL
    import configparser			# Analyse fichier configuration
     
    # Encadrement texte par des quotes normes sql
    quoted_string=lambda txt: psycopg2.extensions.QuotedString(
    	txt.encode("utf-8")
    ).getquoted().decode("utf-8")
     
    # Positionnement des séparateurs de token sql
    setIFS=lambda txt: ".".join("{0}{1}{0}".format("\"", x) for x in txt.split("."))
     
    # Fonction de connexion bdd
    def connectBdd(
    		*args,			# Liste arguments
    		**kwargs,		# Association arguments
    ):
     
    	# Récupération informations de connexion
    	parser=configparser.ConfigParser()
    	parser.read(
    		kwargs.get("config") or os.path.join(
    			os.path.dirname(os.path.abspath(__file__)),
    			"config.ini",
    		)
    	)
     
    	# Paramètres de connexion
    	param=dict()
    	for (key, attrib) in (
    		("host", ("host", "PGHOST", None)),
    		("port", ("port", "PGPORT", None)),
    		(
    			"user",
    			(
    				"user",
    				"PGUSER",
    				os.environ[
    					{
    						"posix" : "LOGNAME",
    						"nt" : "USERNAME",
    					}[os.name]
    				],
    			),
    		),
    		("password", ("password", "PGPASSWORD", None)),
    		(
    			"dbname",
    			(
    				"dbname",
    				"PGDATABASE",
    				os.environ[
    					{
    						"posix" : "LOGNAME",
    						"nt" : "USERNAME",
    					}[os.name]
    				],
    			),
    		),
    	):
    		item=kwargs.pop(key, None)
    		param[key]=item\
    			if item is not None\
    			else parser.get("bdd/connexion", attrib[0]).split("#")[0].strip()\
    				if parser.has_option("bdd/connexion", attrib[0])\
    				else os.getenv(attrib[1]) or attrib[2]
    	# for
     
    	# Connexion
    	return psycopg2.connect(
    		cursor_factory=psycopg2.extras.DictCursor,
    		**param
    	)
    # connectBdd()
     
    # Compteur bdd
    def cpt(
    		bddId):			# Identifiant base de données
     
    	# Curseur de travail
    	with bddId.cursor() as curs:
    		# Nb de schémas et de tables
    		curs.execute(
    			"select %s from %s where (%s) in (%s)" % (
    				", ".join(
    					(
    						"count(distinct %s)" % setIFS("schemaname"),
    						"count(%s)" % setIFS("relname"),
    					)
    				),
    				setIFS("pg_stat_user_tables"),
    				", ".join(
    					(
    						setIFS("schemaname"),
    						setIFS("relname"),
    					)
    				),
    				"select %s from %s where %s is null" % (
    					", ".join(
    						(
    							setIFS("table_schema"),
    							setIFS("table_name"),
    						)
    					),
    					setIFS("information_schema.tables"),
    					setIFS("commit_action"),
    				)
    			)
    		)
    		(nb_schema, nb_table)=curs.fetchone()
     
    		# Nb de séquences
    		curs.execute("select count(*) from %s" % setIFS("information_schema.sequences"))
    		nb_sequence=curs.fetchone()["count"]
     
    		# Recherche liste des tables
    		curs.execute(
    			"select %s from %s where (%s) in (%s) order by %s" % (
    				", ".join(
    					(
    						setIFS("schemaname"),
    						setIFS("relname"),
    						"pg_size_pretty(pg_total_relation_size(%s))" % setIFS("relid"),
    					)
    				),
    				setIFS("pg_stat_user_tables"),
    				", ".join(
    					(
    						setIFS("schemaname"),
    						setIFS("relname"),
    					)
    				),
    				"select %s from %s where %s is null" % (
    					", ".join(
    						(
    							setIFS("table_schema"),
    							setIFS("table_name"),
    						)
    					),
    					setIFS("information_schema.tables"),
    					setIFS("commit_action"),
    				),
    				", ".join(
    					(
    						"%s asc" % setIFS("schemaname"),
    						"%s asc" % setIFS("relname"),
    					)
    				),
    			)
    		)
     
    		# Affichage des compteurs pour chaque table
    		tot_row=0
    		for (schema, table, size) in curs.fetchall():
    			curs.execute("select count(*) from %s" % setIFS("%s.%s" % (schema, table)))
    			cpt=curs.fetchone()["count"]
    			tot_row+=cpt
    			yield "table [%s%s]: %d rows [%s]" % (
    				"%s." % schema if schema != "public" else "",
    				table,
    				cpt,
    				size,
    			)
    		# for
     
    		# Recherche liste des séquences
    		curs.execute(
    			"select %s from %s order by %s" % (
    				", ".join(
    					(
    						setIFS("sequence_schema"),
    						setIFS("sequence_name"),
    					)
    				),
    				setIFS("information_schema.sequences"),
    				", ".join(
    					(
    						"%s asc" % setIFS("sequence_schema"),
    						"%s asc" % setIFS("sequence_name"),
    					)
    				),
    			)
    		)
     
    		# Affichage des informations pour chaque séquence
    		for (schema, sequence) in curs.fetchall():
    			curs.execute(
    				"select %s from %s inner join %s on (%s)" % (
    					", ".join(
    						(
    							setIFS("%s.%s.last_value" % (schema, sequence)),
    							setIFS("pg_sequences.max_value"),
    							"%s * 100.0 / %s" % (
    								setIFS("%s.%s.last_value" % (schema, sequence)),
    								setIFS("pg_sequences.max_value"),
    							),
    						)
    					),
    					setIFS("%s.%s" % (schema, sequence)),
    					setIFS("pg_sequences"),
    					"(%s, %s)=(%s, %s)" % (
    						setIFS("pg_sequences.schemaname"),
    						setIFS("pg_sequences.sequencename"),
    						quoted_string(schema),
    						quoted_string(sequence),
    					),
    				) if (bddId.server_version // 10000) >= 10
    				else "select %s from %s" % (
    					", ".join(
    						(
    							setIFS("last_value"),
    							setIFS("max_value"),
    							"%s * 100 / %s" % (
    								setIFS("last_value"),
    								setIFS("max_value"),
    							),
    						)
    					),
    					setIFS("%s.%s" % (schema, sequence)),
    				)
    			)
    			(last_value, max_value, taux)=curs.fetchone()
    			yield "sequence [%s%s]: last value %d/%d [%d%%]" % (
    				"%s." % schema if schema != "public" else "",
    				sequence,
    				last_value,
    				max_value,
    				taux,
    			)
    		# for
     
    		# Informations générales bdd
    		curs.execute(
    			"select current_database(), pg_size_pretty(pg_database_size(current_database()))"
    		)
    		data=curs.fetchone()
    		yield "%s [%s, %s, %s]: %d rows [%s]" % (
    			data["current_database"],
    			"%d schéma%s" % (
    				nb_schema,
    				"s" if nb_schema > 1 else "",
    			),
    			"%d table%s" % (
    				nb_table,
    				"s" if nb_table > 1 else "",
    			),
    			"%d séquence%s" % (
    				nb_sequence,
    				"s" if nb_sequence > 1 else "",
    			),
    			tot_row,
    			data["pg_size_pretty"],
    		)
    	# with
    # cpt()
     
    # Programme principal
    if __name__ == "__main__":
    	# Fonction "usage"
    	def usage():
    		print("Usage: %s [-h, --host=host] [-p, --port=port] [-U, --user=user] [-P, --password=password] [-?, --help] bdd [bdd ...]" % os.path.basename(__file__))
    		print(
    			"".join(
    				"\tOption %s\n" % x for x in (
    					"-h, --host=host: Connexion sur le serveur host",
    					"-p, --port=port: Connexion sur le port port",
    					"-U, --user=user: Connexion avec l'utilisateur user",
    					"-P, --password=password: Connexion avec le mot de passe",
    					"--config=file: Utilisation du fichier de configuration file",
    					"-?, --help: Utilisation de ce programme",
    				)
    			)
    		)
    	# usage()
     
    	# Gestion des options
    	optItem={
    		"host" : {
    			"opt" : {
    				"court" : "h",
    				"long" : ("host",),
    			},
    			"arg" : True,
    			"value" : None,
    			"fct" : lambda *args: args[1],
    		},
    		"port" : {
    			"opt" : {
    				"court" : "p",
    				"long" : ("port",),
    			},
    			"arg" : True,
    			"value" : None,
    			"fct" : lambda *args: args[1],
    		},
    		"user" : {
    			"opt" : {
    				"court" : "U",
    				"long" : ("user",),
    			},
    			"arg" : True,
    			"value" : None,
    			"fct" : lambda *args: args[1],
    		},
    		"password" : {
    			"opt" : {
    				"court" : "P",
    				"long" : ("password",),
    			},
    			"arg" : True,
    			"value" : None,
    			"fct" : lambda *args: args[1],
    		},
    		"config" : {
    			"opt" : {
    				"court" : "",
    				"long" : ("config",),
    			},
    			"arg" : True,
    			"value" : None,
    			"fct" : lambda *args: args[1],
    		},
    		"help" : {
    			"opt" : {
    				"court" : "?",
    				"long" : ("help",),
    			},
    			"arg" : False,
    		},
    	}
    	try:
    		(optList, args)=getopt.getopt(
    			sys.argv[1:],
    			"".join(
    				"%s%s" % (x["opt"]["court"], ":" if x["arg"] else "")
    				for x in optItem.values() if x["opt"]["court"]
    			),
    			tuple(
    				"%s%s" % (x, "=" if y["arg"] else "")
    				for y in optItem.values() for x in y["opt"]["long"]
    			),
    		)
    	except getopt.GetoptError as eClass:
    		print("%s: %s" % (os.path.basename(__file__), eClass))
    		usage()
    		exit(1)
    	# try
     
    	for (opt, val) in optList:
    		if opt in (
    			tuple("-%s" % x for x in optItem["help"]["opt"]["court"])
    			+ tuple("--%s" % x for x in optItem["help"]["opt"]["long"])
    		):
    			usage()
    			exit(0)
    		# if
    		for (k, v) in optItem.items():
    			if v.get("fct") is None or opt not in (
    				tuple("-%s" % x for x in v["opt"]["court"])
    				+ tuple("--%s" % x for x in v["opt"]["long"])
    			): continue
    			need=v["fct"](opt, val)
    			r=v["fct"](opt, val, optItem[k]["value"])
    			if r is not None: optItem[k]["value"]=r
    		# for
    	# for
     
    	# Suppression des options de la liste des arguments
    	sys.argv=(__file__,) + tuple(args)
     
    	# Versions Python et Psycopg2
    	print("Python version %s" % sys.version)
    	print("Psycopg version %s" % psycopg2.__version__)
     
    	# Traitement des arguments éventuels
    	for bdd in sys.argv[1:] if len(sys.argv) > 1 else (None,):
    		# Connexion bdd
    		bddId=connectBdd(
    			config=optItem["config"]["value"],
    			host=optItem["host"]["value"],
    			port=optItem["port"]["value"],
    			user=optItem["user"]["value"],
    			password=optItem["password"]["value"],
    			dbname=bdd,
    		)
    		print("bddId [%s]" % bddId)
     
    		# Compteur
    		print("".join("%s\n" % x for x in cpt(bddId)))
     
    		# Fermeture bdd
    		bddId.close()
    	# for
    # if

    On peut le lancer avec les paramètres standards des commandes Postgres (-h ... -U ... etc) ou bien les stocker dans un fichier de configuration nommé "confi.ini" sous cette forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #
    # Fichier de configuration pour les outils de manipulation bdd
    #
     
    # Configuration pour la connexion bdd
    [bdd/connexion]
    host = /tmp						# Serveur (chemin=socket)
    port = 5432						# Port
    dbname = bdd_truc					# Nom bdd
    user = postgres 					# Utilisateur bdd
    #password = xxx						# Mot de passe utilisateur (danger)
    Mais il ne fonctionnera que si ton OS possède Python (automatique sous Linux) + le module psycopg2

  3. #3
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 001
    Points : 2 505
    Points
    2 505
    Par défaut
    Merci beaucoup pour ta réponse détaillée; a priori je pense que le pb est sur le F:\*** comme tu dis, car le répertoire est bien accédé, les fichiers de sauvegarde créés etc etc
    Je vais voir pour tester que toutes les lignes ont bien été exportées.

  4. #4
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    F:\00000 Applications\PostgreSQL\bin>pg_basebackup --format=tar --wal-method=stream --checkpoint=fast --progress -h 127.0.0.1 -U sauve -D F:\00000\backups\
    Comme ça, sans "trailing back-slash":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    F:\00000 Applications\PostgreSQL\bin>pg_basebackup --format=tar --wal-method=stream --checkpoint=fast --progress -h 127.0.0.1 -U sauve -D F:\00000\backups

  5. #5
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 001
    Points : 2 505
    Points
    2 505
    Par défaut
    OK tsuji, je pense que tu as raison, j'avais oublié un \ à la fin de mon chemin...

    En tout cas ça n'a pas empêché PostgreSQL de créer le répertoire et la sauvegarde, ce qui me pose pb...
    Visiblement la politique n'est pas la même que sous Oracle où, à la première erreur, la commande s'arrête : perso je préfère, c'est un comportement plus simple à comprendre.
    Je n'ai rien contre mais je trouve que Postgre prend des libertés avec les ordres SQL, si la commande ne marche pas il va alors essayer de la transformer... bizarre, ça manque de rigueur...

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 735
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 735
    Points : 31 060
    Points
    31 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Ikebukuro Voir le message
    OK tsuji, je pense que tu as raison, j'avais oublié un \ à la fin de mon chemin...
    Sous Linux ça ne gêne pas...

    Citation Envoyé par Ikebukuro Voir le message
    Visiblement la politique n'est pas la même que sous Oracle où, à la première erreur, la commande s'arrête : perso je préfère, c'est un comportement plus simple à comprendre.
    Je n'ai rien contre mais je trouve que Postgre prend des libertés avec les ordres SQL, si la commande ne marche pas il va alors essayer de la transformer... bizarre, ça manque de rigueur...
    Et encore...
    il y a quelque temps lors d'une discussion avec SQLPro on a découvert que, contrairement à la norme SQL, les noms de contraintes n'étaient pas uniques.
    Bon ça ne m'empêche pas d'aimer Postgres pour sa puissance professionnelle qui tient le niveau face à Oracle tout en étant gratuit. Mais il y a des petits détails à garder en tête...

  7. #7
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 001
    Points : 2 505
    Points
    2 505
    Par défaut
    Citation Envoyé par Ikebukuro Voir le message
    OK tsuji, je pense que tu as raison, j'avais oublié un \ à la fin de mon chemin...
    Je viens de retenter le backup, cette fois ça passe si je ne mets pas de \ à la fin.

    Présence de \ à la fin du chemin : "problème" mais les sauvegardes sont créées et le répertoire backups aussi.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    F:\00000 Applications\PostgreSQL\bin>pg_basebackup --format=tar --wal-method=stream --checkpoint=fast --progress -h 127.0.0.1 -U sauve -D F:\00000\backups\
    Mot de passe :
    46247/46247 Ko (100%), 1/1 tablespace
    pg_basebackup: erreur : n'a pas pu ouvrir le fichier « F:\00000\backups\ » : No such file or directory

    Je supprime le répertoire backups, je ne mets pas de \ à la fin du chemin : pas de message d'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    F:\00000 Applications\PostgreSQL\bin>pg_basebackup --format=tar --wal-method=stream --checkpoint=fast --progress -h 127.0.0.1 -U sauve -D F:\00000\backups
    Mot de passe :
    46247/46247 Ko (100%), 1/1 tablespace
    
    F:\00000 Applications\PostgreSQL\bin>

  8. #8
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    J'ai bien pourtant testé avant de répondre. Mais je tends d'être d'accord que c'est une erreur qui ne devrait pas une. Ce serait un petit bogue qui devrait à mon sens être rectifié un jour (probablement à pgcheckdir.c ou à son alentour).

    On ne peut pas reprocher la documentation qui donne consistemment un parcours sans La barre oblique inversée de fin. Pourtant, quand même, on met souvant une là pour rappeler que c'est un parcours d'un répertoire.

    La ligne de command accept aussi un parcours style *nix. Dans ce cas, il n'est plus de problème, avec ou sans, absolu ou relatif.
    Code text : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    F:\00000 Applications\PostgreSQL\bin>pg_basebackup --format=tar --wal-method=stream --checkpoint=fast --progress -h 127.0.0.1 -U sauve -D F:/00000/backups
    F:\00000 Applications\PostgreSQL\bin>pg_basebackup --format=tar --wal-method=stream --checkpoint=fast --progress -h 127.0.0.1 -U sauve -D F:/00000/backups/

  9. #9
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 001
    Points : 2 505
    Points
    2 505
    Par défaut
    Tsuji, c'est normal que dans ton dernier message il y ait alternance de barres / et \ dans les chemins?

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 735
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 735
    Points : 31 060
    Points
    31 060
    Billets dans le blog
    1
    Par défaut
    En fait ce que tu vois avec les backslashes c'est son prompt, prompt qui montre l'emplacement où il se trouve vu par zindow (F:\...\...).
    Ensuite il tape sa ligne de commande en indiquant là l'emplacement du backup en style *nix. Donc dans ce qu'il tape, il n'y a que des slashes.

  11. #11
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Je veux dire pour -D, on peut mettre /. Pour le parcours de l'appli pg_basebackup, c'est \ bien-entendu - on est en windows !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [TSocket] Message d'erreur
    Par rgz dans le forum Web & réseau
    Réponses: 6
    Dernier message: 04/07/2003, 10h16
  2. Surcharger le message d'erreur après un OnException
    Par Tirlibibi dans le forum XMLRAD
    Réponses: 2
    Dernier message: 24/04/2003, 12h42
  3. Réponses: 4
    Dernier message: 04/03/2003, 02h05
  4. [CR] Message d'erreur
    Par nono1 dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 11/09/2002, 15h54
  5. Réponses: 2
    Dernier message: 27/05/2002, 20h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo