En Oracle versión 11g:
Después de buscar en Google, no puedo encontrar una manera simple de recuperar espacio libre después de eliminar una tabla.
He encontrado muchas explicaciones, que dicen cómo el archivo de datos se fragmenta, la gran pila de consultas aburridas que tienes que ejecutar para mover el "espacio vacío" al final del archivo de datos (tabla por tabla ... incluso cuando tener 200 mesas!?).
Luego, debe reducir el tamaño del archivo de datos "adivinando" cuánto puede reducirlo, o debe saber exactamente cuál es su "tamaño de bloque" ... Y, por último, no debe olvidarse de "reconstruir los índices".
Ver por ejemplo: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:54178027703899
y http://www.oracle-base.com/articles/misc/ReclaimingUnusedSpace.php
¿Existe un procedimiento PL / SQL simple que, dado un nombre de espacio de tabla o un nombre de archivo de datos, sería adecuado para ese trabajo? ¿O alguna herramienta similar de Oracle?
fuente
Respuestas:
La respuesta corta es no . Desafortunadamente, la forma de hacer esto en Oracle requiere la "gran pila de consultas aburridas". Los artículos a los que se vinculó son la mejor información disponible sobre el tema. De hecho, el archivo de datos se fragmenta, de modo que incluso si el espacio libre existe debajo del segmento más alto, Oracle no lo consolidará automáticamente cuando
RESIZE
haya terminado.Para "desfragmentar" el espacio de tablas, debe mover estos segmentos al inicio del archivo de datos en lugar de al final. Para las tablas, este es un proceso fuera de línea, lo que significa que la tabla no estará disponible mientras se realiza el movimiento. Los índices se pueden mover fuera de línea o con Enterprise Edition, se pueden mover en línea. Como tiene una ventana de interrupción, le recomiendo que siga estos pasos.
A. Reduzca los archivos de datos con espacio libre más allá de la marca de límite superior. Esto se puede hacer de la siguiente manera (la consulta es similar al procedimiento de Frosty Z):
B. Después de reducir las cosas por encima de la marca de agua alta, averigüe qué espacios de tabla aún se beneficiarían si se movieran los segmentos.
C. Para cada uno de estos espacios de tabla, determine qué segmentos deben moverse. (Reemplace USUARIOS con el nombre de su tablespace o únase a él con la consulta anterior)
D. Mueva cada tabla y reconstruya los índices y estadísticas.
E. Repita el paso A.
Acabo de construir la mayoría de estas consultas, por lo que querrá probarlas a fondo antes de usarlas. Supongo que podría crear un procedimiento que usaría
EXECUTE IMMEDIATE
para crear las declaraciones reales para que se ejecuten dinámicamente, pero debido a que las consultas recibirán ORA-08103: el objeto ya no existe mientras el movimiento está en progreso, creo que es mejor controlar ese proceso manualmente incluso si significa un poco más de tiempo / esfuerzo.fuente
Solución parcial inspirada en esta página :
No reorganiza el espacio libre, pero detecta automáticamente el espacio libre disponible al final de los archivos de datos e imprime los comandos 'RESIZE' adecuados.
fuente
Antes de intentar reducir los archivos de datos, pregúntese: ¿va a crear nuevos segmentos nuevamente dentro del espacio de tablas asociado en un futuro no tan lejano? Si es así, no tiene sentido encogerse. El espacio simplemente se reutilizará para sus nuevos segmentos y se ahorrará mucho esfuerzo al sistema y lo dejará como está.
fuente
Después de navegar en Google durante días, he encontrado el ejemplo más simple y claro para reclamar el espacio libre en el espacio de tabla después de eliminarlo. espero que esto ayude
Enlace: http://www.dbforums.com/oracle/976248-how-reduce-tablespaces-used-space-after-delete-records-2.html
solución:
Creemos una tabla con 9999 filas, cada una de ellas con un tamaño de alrededor de 1k:
La tabla tiene 29 extensiones asignadas, para un total de 14.6M:
Eliminemos TODAS las filas:
Ahora- "sorpresa" - la tabla todavía usa las mismas extensiones:
Por qué ? Porque incluso si elimina todas las filas de la tabla, la High Water Mark no disminuye, nunca disminuye para permitir la máxima concurrencia (Oracle se toma muy en serio la maximización de la concurrencia, es decir, el rendimiento y la escalabilidad; es la razón principal de su éxito en aplicaciones empresariales).
Desasignar el espacio no utilizado (= espacio sobre el HWM) no ayuda mucho (ya que no hay mucho espacio no utilizado sobre el HWM):
Ahora, MOVEMOS la tabla, que en esencia significa clonar la tabla (incluidos los desencadenantes, restricciones, etc.), transferir las filas, soltar la tabla "antigua" y cambiar el nombre de la nueva, todo hecho por el núcleo, muy seguro incluso en caso de falla de la máquina / servidor:
Ahora, solo tenemos la extensión inicial asignada:
Advertencia: normalmente sucede que muchos / todos los índices de la tabla no se pueden usar después del movimiento (no en este caso, pero estoy ejecutando 9.2.0.4, la última versión, que probablemente ha optimizado el proceso en el caso de tablas totalmente vacías ):
Si STATUS no fuera VÁLIDO, simplemente podría reconstruir manualmente los índices:
O podría automatizar todo el proceso:
Como ejemplo, configuremos manualmente el índice como INUSABLE:
HTH Alberto
fuente
Como se dijo anteriormente, tendrá que mover todas las más de 200 tablas en ese espacio de tablas para liberar espacio en su archivo de datos y luego cambiar el tamaño para recuperar el espacio. Pero en lugar de ejecutar todas esas consultas, 12c Enterprise Manager realiza esta tarea. Tendrá que navegar a Inicio de la base de datos> Almacenamiento> Espacio de tabla. Seleccione el espacio de tabla en el que desea trabajar y haga clic en Reorganizar. Le dará una opción para ver las instrucciones SQL que están a punto de ejecutarse. Puede tomar una copia de ellos y ejecutarla usted mismo o programar un trabajo en EM.
Realmente crea otro espacio de tabla, mueve todos los objetos al nuevo espacio de tabla, reconstruye los índices y suelta los objetos del antiguo espacio de tabla.
Hay un par de inconvenientes en los que puedo pensar. Esto debe hacerse durante las horas de menor actividad; de lo contrario, aparecerá un error diciendo que el recurso está ocupado. El archivo de datos (no el espacio de tabla) tendrá "reorg" agregado a su nombre, hacia el final.
fuente