Mam aplikację Django z zapleczem postgresql. Postgresql od czasu do czasu tworzy pliki tymczasowe - może to zabijać, jeśli miejsce na dysku jest krytyczne (jak w moim przypadku).
Jednym ze sposobów rozwiązania tego problemu jest utworzenie dowiązania symbolicznego do innej lokalizacji magazynu, w której miejsce na dysku nie stanowi wąskiego gardła. W moim przypadku postgresql przechowuje pliki tymczasowe pod adresem /$PGDATA/base/pgsql_tmp
. Mam zamontowany duży dysk SSD /mnt
, więc chcę, aby pliki tymczasowe tam rezydowały. Należy się tym zająć:
ln -sTf /mnt/pgsql_tmp $PGDATA/base/pgsql_tmp
chown -R postgres /mnt/pgsql_tmp #ensuring user 'postgres' has the right perms
chmod o+x /mnt
Zanim zrobiłem to w produkcji, postanowiłem przetestować to lokalnie. Stworzyłem /mnt
i /pgsql_tmp
na pulpicie, a następnie spróbowałem ln -sTf /home/hassan/Desktop/mnt/pgsql_tmp /home/hassan/Desktop/pgsql_tmp
.
Ale to mi daje ln: ‘/home/hassan/Desktop/pgsql_tmp’: cannot overwrite directory
. Czy ktoś może wskazać, co robię źle? Będąc neofitą, naprawdę próbuję owinąć głowę, jak to działa.
źródło
T
if
flagiln
, a potem myślę, że nie powinien tego robić w ogóle. Po pierwsze, jest nieprzejrzysty. Po drugie, bazy danych uwielbiają mieć wszystko pod kontrolą, a nawet możliwe jest, że system nie otworzy takiego pliku, ponieważopen()
można powiedzieć, że wywołania traktują dowiązania symboliczne jako błędy. Powodem jest to, że linki symboliczne mogą wskazywać niemal wszędzie. Pierwszym wyborem powinna być zmiana konfiguracji bazy danych.Odpowiedzi:
Najlepiej jest usunąć
~/pgsql_tmp
i pozwolić, aby polecenie ln go utworzyło.Pierwsza uwaga, że LN nie łączy dwóch obiektów; tworzy link do celu o określonej nazwie z miejsca.
ln [OPTION]... [-T] TARGET LINK_NAME
Podczas tworzenia łącza za
ln
pomocą argumentu NAZWA powinien wskazywać obiekt, który jeszcze nie istnieje, i zostanie utworzony w wyniku polecenia. W twoim przypadku już go utworzyłeś (~/pgsql_tmp
) jako katalog.Zwykle możesz użyć
-f
przełącznika, aby wymusić usunięcie wszystkiego, co już pokrywa się ze ścieżką NAME, ale w twoim przypadku określiłeś,-T
co oznacza, że chcesz utworzyć link jako plik, a nie katalog. Kiedy więc-f
idzie nadpisać obiekt w NAME, próbuje on nadpisać katalog plikiem.Możesz więc utworzyć łącze jako katalog i użyć opcji -f lub usunąć obiekt pokrywający się z NAZWĄ, a następnie utworzyć łącze. Później jest najlepszą opcją.
źródło
/pgsql_tmp
i pozwolenie naln
utworzenie polecenia było głównym składnikiem, którego mi brakuje. Powiedz mi coś. Mój prawdziwy scenariusz jest taki, że dzienniki postgresql są zapisywane/$PGDATA/base/pgsql_tmp
, podczas gdy chcę, aby wszystkie one rezydowały/mnt/pgsql_tmp
. Więc to jest to, co muszę zrobić: najpierw usuń folderpgsql_tmp
wewnątrz/$PGDATA/base/
. Utwórz folder o nazwie/pgsql_tmp
wewnątrzmnt
, a następnie uruchomln -s /mnt/pgsql_tmp /$PGDATA/base/pgsql_tmp
. Poprawny?/$PGDATA/base/
domnt/pgsql_tmp
nich.you can either create the link as a directory and use -f
Nie widzę innego sposobu, abyln
zmienić katalog na dowiązanie symboliczne poza usunięciem katalogu przed uruchomieniemln
. Co w ogóle oznacza „utwórz link jako katalog”?